我们创建的每个函数都有一个prototype
(原型)属性,这个属性是一个指针
,指向一个对象(如图中的Person.prototype
对象),而这个对象包含所有实例共享的属性和方法。
function Person () {
this.nation = '中国'
}
Person.prototype.name="Nicholas";
typeof Person.prototype // "object"
Person.prototype{
constructor:Foo()
name:"Nicholas"
__proto__:Object
}
Person.prototype.__proto__{
constructor:Object()
hasOwnProperty:hasOwnProperty()
isPrototypeOf:isPrototypeOf()
propertyIsEnumerable:propertyIsEnumerable()
toLocaleString:toLocaleString()
toString:toString()
valueOf:valueOf()
...
}
var Person1=new Person();
typeof Person1.prototype // "undefined"
typeof Person1.__proto__ // "object"
Person1.name // "Nicholas"
Person1.nation // "中国"
这里的Person1.__proto__
指向Person.prototype
对象,this
会指向新的实例,Person1
从Person
构造函数中复制了一个career
属性。如果新建多个实例,就相当于从Person
构造函数复制了多个career
属性,这种做法对内存是很不友好的,所以一般会将公用的属性写在prototype对象中。
这里的__proto__
并不是一个标准的属性,它表示对象的原型。