原型和原型链
名称
prototype:原型
__proto__:原型链(准确说为原型链的节点,所有节点构成的关系链才是原型链)
从属关系
prototye:函数属性
__proto__:Object属性
两者都是对象
!!!对象的__proto__保存着该对象的构造函数的prototype!!!
基本认知
function a(){}
console.log(a.prototype) //函数a的构造函数constructor
let b = new a;
console.log(b.__proto__) //函数a的构造函数constructor
console.log(a.prototype === b.__proto__); //true
//综上:对象的__proto__保存着该对象的构造函数的prototype
console.log(a.prototype.__proto__ === Object.prototye) //true
console.log(Object.prototye.__proto__) //null
//综上,原型链顶层为Object.prototype
原型链继承
function a(){
this.x = 1;
};
console.log(a);
/*
a{
prototype:{
constructor:f a() ---a自身
__proto__:Object.prototype:{
...
}
...
}
__proto__:{
f() ---Function
...
}
...
}
*/
a.prototype.y = 2;
Object.prototype.z = 3;
let b = new a();
console.log(b.x); //1
console.log(b.y); //2
console.log(b.z); //3
console.log(b); //b -> a -> Object
/*
b{
a:1,
__proto__:{
a.prototype:{
y:2,
__proto__:{
Object.prototype:{
z:3,
...
}
...
}
...
}
...
}
}
*/
Function与Object
//Function与Object既是对象也是函数
function a(){};
console.log(a.__proto__); //f{} ---Function.prototype
console.log(a.__proto__ === Function.prototype) //true
console.log(Function.prototype === Function.__proto__) //true
//function a(){} 与 var a = new Function()
//let obj = {} 与 let obj = new Object()
console.log(Function.prototype === Object.__proto__) //true
console.log(Function.__proto_ === Object.__proto__) //false
属性是否存在判断方法
对象内置方法:object.hasOwnProperty(); //查找本身属性
'属性' in object //查找整个链上的属性
构造函数constructor
//实例化对象的constructor属性 -> 实例化对象的构造函数
fucntion a(){
this.x = 1;
}
let b = new a();
console.log(b.constructor === a) //true
//constructo允许更改