都是代码人,用代码交流吧,上代码:
初级原型链:
<script>
//构造函数
function Person() {
};
//实例(每个实例对象都有一个__proto__属性指向原型对象)
var zhang = new Person();
//原型对象(每个函数都有一个prototype属性指向原型对象)
Person.prototype;
// 原型对象又有一个constructor属性指向构造函数。
// 验证:
console.log(Person.prototype.constructor === Person) //true
console.log(zhang.__proto__ === Person.prototype) //true
</script>
想法: 原型对象,其实也可以看作是一个实例对象,也有__proto__属性
// 打印一下原型对象:
console.log(Person.prototype)
完整代码:
<script>
//构造函数
function Person() {
};
//实例(每个实例对象都有一个__proto__属性指向原型对象)
var zhang = new Person();
//原型对象(每个函数都有一个prototype属性指向原型对象)
Person.prototype;
// 原型对象又有一个constructor属性指向构造函数。
// 验证:
console.log(Person.prototype.constructor === Person) //true
console.log(zhang.__proto__ === Person.prototype)
// 想法:原型对象,其实也可以看作是一个实例对象,也有__proto__属性
// 打印一下原型对象:
console.log(Person.prototype)
//Person.prototype指向的原型对象
console.log(Person.prototype.__proto__)
//Person.prototype指向的原型对象的构造函数
console.log(Person.prototype.__proto__.constructor)
// 验证:
console.log(Person.prototype.__proto__.constructor.prototype === Person.prototype.__proto__) //true
//Person.prototype指向的原型对象的原型对象
console.log(Person.prototype.__proto__.__proto__) //null
</script>
注意点:proto 并不是语言本身的特性,这是各大厂商具体实现时添加的私有属性,虽然目前很多现代浏览器的 JS 引擎中都提供了这个私有属性,但依旧不建议在生产中使用该属性,避免对环境产生依赖。生产环境中,我们可以使用 Object.getPrototypeOf 方法来获取实例对象的原型,然后再来为原型添加方法/属性。