原型链是什么?
- 只有函数才有prototype属性
- 函数的prototype属性是一个有constructor方法的对象,且这个对象的constructor方法指向函数本身
- 实例对象的proto对象指向其构造函数的prototype属性
function Student(name){
this.name=name;
}
const s1 = new Student('jack');
s1._proto_ === Student.prototype //true
Student.prototype.constructor === Student // true
根据最新的ES语法,应避免使用proto属性,应使用Object.setPrototypeOf(target)、Object.getPrototypeOf(target)来替代。
构造函数或者new做了什么?
- 创建一个全新的对象
- 将对象的proto指向构造函数的prototype
- 将this绑定到新创建的对象上
我们称这个新的对象为这个函数的实例。
原型链
instanceof
: 用于测试构造函数的prototype属性是否出现在对象的原型链中的任何位置isPrototypeOf
:测试一个对象是否存在于另一个对象的原型链上- 原型链的终点:Object.prototype 为null
- 查找自身的属性,禁止查询原型链:xxx.hasOwnProperty(‘xxx’)