一、术语介绍
1. 原型:
- 对于对象,都有一个隐藏属性 "[[Prototype]]",可以通过 "proto" 来访问。可以叫做对象的原型
2. 原型链
- 对象的原型属性指向另一个对象。层层向上访问组成了原型链
二、原型的作用
- 实现属性在对象间的重用
jsx
const person = { prop2: 'personal prop' };
const son = {
prop: 'kid prop',
__proto__: person,
};
console.log(son.prop2) // personal prop
三、原型和构造函数的关系
- js中每声明一个函数,该函数都有一个prototype属性。
jsx
function x() {};
console.log(x.prototype);
/*
默认情况下 x.prototype等于
{
constructor: f x()
[[Prototype]]: Object
}
*/
- 当new一个函数的时候,会发生什么
- 创建一个全新的对象
- 将对象内部的 [[Prototype]]指向该函数的prototype属性
- 新对象绑定到函数调用的this
- 判断函数返回值,如果是对象,这返回该对象,否则返回this。(注意:如果返回的是自定义的对象,则该对象的 [[prototype]] 指向object )
总结:没有自定义构造函数返回对象的情况下,构造函数返回的对象 [[Prototype]]属性指向函数的prototype。
四、关于继承
js中,可以通过原型链来实现function原型属性的继承。
参考数据:
- [1] [你不知道的JavaScript]
- [2] [JavaScript高级程序设计]
- [3] [mdn](https://developer.mozilla.org/)