1. 什么是原型
在javascript中,每一个构造函数的内部都有一个 prototype 属性,它的属性值是一个对象,这个对象包含了可以由该构造函数的所有实例共享的属性和方法。当使用构造函数新建一个对象后,在这个对象的内部将包含一个指针,这个指针指向构造函数的 prototype 属性对应的值,在 ES5 中这个指针被称为对象的原型。
2. 获取原型对象的方法
- Object.getPrototypeOf() — 推荐使用
- 实例对象.
__proto__
— 不推荐使用 - 构造函数.prototype
function Person() {
this.name = 'xiong'
this.age = 22
this.getAgeAdd = () => {
console.log(this.age + 1)
}
}
let person1 = new Person()
console.log(person1.name, person1.age) // xiong 22
person1.getAgeAdd() // 23
let isTrue = Person.prototype === Object.getPrototypeOf(person1)
console.log(isTrue) // true
3. __proto__
(隐式原型)和prototype(显式原型)
3.1 显示原型
- 函数都有自己的prototype属性(回调函数除外,它没有prototype属性),即显示原型。这个属性指向原型的对象。
- 函数都有一个显示原型和一个隐式原型
3.2 隐式原型
- 实例对象都有一个内置属性[[prototype]],通过有__proto__属性访问,__proto__即隐式原型。
- 在ES5之前没有定义标准,在浏览器中可以使用__proto__(非标准)去访问,目前使用ES6新增的对象Object.getPrototypeOf() 和Object.setPrototypeOf()去访问和设置原型对象。
3. 什么是原型链
当访问对象中的属性和方法的时候,如果在当前对象中无法找到,就会到对象的原型对象中查找。原型对象也有自己的原型,就这样顺着原型向上一直找,就形成了一条原型链。
4. 原型链的终点是什么
null
5. 扩展
5.1 new 操作符过程
- 第一步:创建一个空对象{}
- 第二步:将构造函数的prototype属性,赋给对象的__proto__属性
- 第三步:执行构造函数,将this绑定到对象上
- 第四步:根据构造函数返回值判断,如果返回原始值类型则忽略
注意:回调函数没法new 对象,它没有自己的prototype属性,也没有属于自己的this