- 每个构造函数,默认都有个prototype属性。因为构造函数其实是一个普通的函数,所以可以说每一个函数都有一个protoype属性。
function Person(){
}
Person.prototype // 构造函数的原型对象 Person {}
因为没有设置过构造函数的原型,所以默认是可以个空对象。
- 每一个prototype都一个constructor属性,指向该构造函数。
function Person(){
}
Person.prototype.constructor // [Function: Person]
- 每一个通过构造函数new出来的实例,都有一个proto指向构造函数的原型即prototype
function Person(){
}
var p1 = new Person();
p1.__proto__ === Person.prototype // true
- 当创建的实例后,对原型的属性的修改,实例也会更新,因为实例的地址还是指向同一个原型;但是如果对原型重新赋值为另外一个对象,则不会,导致实例已经和构造函数的原型不一致。
function Person(){
}
var p1 = new Person();
// 对构造函数的原型对象添加属性
Person.prototype.name = 'hello world';
p1.name === 'hello world' // true
// 对构造函数的原型对象重新赋值为另外一个对象
Person.protoype = {name: 'new name'}
p1.name === 'new name' // false