通过近期的一次笔试发现我对原型链的一些属性掌握的不是很好,所以再来写一片文章补充;
关于
__proto__
属性
下面的请谨记
1,每个对象都有名为__proto__
属性
2,每个对象的__proto__
属性都指向自身构造函数的prototype
来看代码:
function func(){};
var f1 = new func();
//f1是func的实例,所以f1的__proto__指向func的原型对象
console.log(f1.__proto__ === func.prototype);//true
//func的__proto__指向定义它的Function.prototype
console.log(func.__proto__ === Function.prototype);//true
//Function由自身构造
console.log(Function.__proto__ === Function.prototype);//true
//由上面三个 true可知所有构造函数的__proto__
//prototype也是对象,所以它的__proto__指向Object.prototype
console.log(Function.prototype.__proto__ === Object.prototype);//true
console.log(func.prototype.__proto__ === Object.prototype);//true
//由这两行可知:所有构造函数的prototype的__proto__都指Object.prototype
//Object也是构造函数,所以同上构造函数的__proto__ 指向Function.prototype
console.log(Object.__proto__ === Function.prototype)//true
//Object.prototype作为最终的源头,它的__proto__是null
console.log(Object.prototype.__proto__ === null);//true
var a = {};
//由于a是以字面量方式创建的对象,所以不需要经过Function,a.__proto__属性直接指向Object.prototype
console.log(a.__proto__ === Object.prototype)
console.log(a.__proto__.__proto__ === null);//true
console.log(a.__proto__.constructor === Object);//true
console.log(a.__proto__.constructor.__proto__ === Function.prototype);//true
console.log(a.__proto__.constructor.__proto__.__proto__ === Object.prototype);//true
console.log(a.__proto__.constructor.__proto__.__proto__.__proto__ === null);//true
console.log(a.__proto__.constructor.__proto__.__proto__.constructor.__proto__ === Function.prototype);//true
最后附上一张图:
1030655-20161031041705971-1605480841.jpg
网友评论