普通对象和函数对象

普通对象: 除了用 new Function() 创建的对象都是普通对象 函数对象: 用 new Function 创建的对象

注意: Object,Function 都是用 new Function 创建的,所以是函数对象

构造函数

function Person(name, age) {
    this.name = name
    this.age = age
}

var p1 = new Person(‘hk’, 18)
var p2 = new Person(‘xiaoming’, 8)

上例中,p1p2Person实例,实例有一个constructor属性,该属性是一个指针,指向Person,即有

p1.constructor === p2.constructor === Person

两个概念(构造函数,实例):

  1. p1p2 都是 构造函数 Person 的实例
  2. 实例的constructor属性指向构造函数。

原型对象

每个函数对象都有一个prototype属性,这个属性指向函数的原型对象 每个原型对象都有一个constructor属性,这个属性指向prototype属性所在的函数

proto

p1.__proto__ === Person.prototype // true

要明确的真正重要的一点就是,这个连接存在于实例(p1)与构造函数(Person)的原型对象(Person.prototype)之间,而不是存在于实例(p1)与构造函数(Person)之间。

new 的作用

new Foo = function(Foo) {
	var o = {}
	o.__proto__ = Foo.prototype
	Foo.call(o)
	return o
}

构造器

新对象 obj 是使用 new 操作符后跟一个构造函数来创建的。构造函数(Object)本身就是一个函数(就是上面说的函数对象),它和上面的构造函数 Person 差不多。只不过该函数是出于创建新对象的目的而定义的。所以不要被 Object 吓倒。

同理,可以创建对象的构造器不仅仅有 Object,也可以是 Array,Date,Function等。 所以我们也可以构造函数来创建 Array、 Date、Function