原型链
原型与原型层层相链接的过程即为原型链
对象可以使用构造函数prototype原型对象的属性和方法,就是因为对象有proto原型的存在每个对象都有proto原型的存在
原型规则
- 所有引用类型,都具有对象特性,可只有拓展属性, null除外
- 所有的引用类型,都有一个proto属性, 属性值是普通对象,隐式原型
- 所有的函数都有prototype属性,属性值也是普通对象,(箭头函数除外,没有 prototype 属性,即指向 undefined)
- 所有的引用类型值的隐式类型指向它构造函数的显示属性值
当得到对象的某个属性时候,如果这个对象本身没有这个属性,会到它的proto里面去找,相当于,去构造函数的显式原型里面去找
构造函数例子
function Foo(name, age) {
this.name = name
this.age = age
this.class = ‘class-1’
// return this 默认有
}
var f = new Foo(‘wangmo’, 20)
function Father(name) {
this.name = name;
}
let son = new Father(‘Lisa’);
console.log(son); //Father {name: “Lisa”}
function Star(name) {
this.name = name;
}
let obj = new Star(‘小红’);
console.log(Star.prototype.constructor === Star);//true
console.log(obj.proto.constructor === Star); //true
原型的构造器指向的是构造函数原型的构造器
再试着判断f instanceof Object
f的proto一层一层往上找,看看能否对应到foo的prototypeintanceof执行逻辑
创建了一个空对象son{}
- 为son准备了一个原型连接, son.proto === fater.prototype
- 重新绑定this,使构造函数的this,指向新对象Father.call(this)
- 为新对象赋值
- 返回this
new 一个对象的过程中,发生了什么
function Father(name) {
this.name = name;
}
let son = new Father('Lisa');
console.log(son); //Father {name: "Lisa"}
- 创建了一个空对象son{}
- 为son准备了一个原型连接, son.proto === fater.prototype
- 重新绑定this,使构造函数的this,指向新对象Father.call(this)
- 为新对象赋值
- 返回this
intanceof执行逻辑
f的proto一层一层往上找,看看能否对应到foo的prototype
再试着判断f instanceof Object原型的构造器
原型的构造器指向的是构造函数function Star(name) {
this.name = name;
}
let obj = new Star('小红');
console.log(Star.prototype.constructor === Star);//true
console.log(obj.__proto__.constructor === Star); //true