js 原型链
1.每个函数都有一个 prototype 属性指向原型对象。函数创建的实例对象有一个__proto__属性指向该函数的原型对象。函数的原型对象的constructor属性指向该函数。
function Peple(){
}
var p1 = new Peple(); //创建Peple的实例对象
var p_proto = Peple.prototype // Peple的原型对象
console.log(p_proto === p1.__proto__) // true
console.log(p_proto.constructor === Peple) // true
p_proto.myName = "test"; // 在原型对象上添加myName属性
console.log(p1.__proto__.myName) / / test 实例对象通过__proto__访问原型对象
console.log(p1.myName) // test (实例对象没有的属性会继续往上到原型对象上查找)
2.原型对象 p_proto 实际上是Object 的实例
console.log(Object.prototype === p_proto.__proto__) // true
console.log(Object.prototype.__proto__) // null (原型链顶端)
3.p1.__proto__.__proto__.__proto__ == null (p1.__proto__.__proto__ == Object.prototype )
4.特殊 Function的原型 理解 Function 也是自己的实例对象
console.log(Array.__proto__) // ƒ () { [native code] }
console.log(Object.__proto__) // ƒ () { [native code] }
console.log(Function.__proto__) // ƒ () { [native code] }
console.log(Function.__proto__ === Function.prototype) // true
console.log(Function.constructor === Function) // true