一:prototype
属性
- 这是一个显式原型属性,只有函数才拥有该属性,基本上所有函数都有这个属性。
-
prototype
如何产生
当我们声明一个函数时,这个属性就自动被创建了
function Foo() { }
这个属性的值是一个对象(也就是原型),只有一个属性constructor
二:constructor
属性
constructor
是一个公有且不可枚举的属性,constructor
属性指向构造函数(即Foo()
)
作用:让实例知道是什么函数构造了它
总结:构造函数通过 prototype
属性指向原型,原型的 constructor
属性指回构造函数
三:__proto__
属性
- 每个JS对象都有
__proto__
属性,指向了创建该对象的构造函数的原型 -
prototype
是内部属性,我们并不能访问到,所以使用_proto_
来访问。通过_proto_
将对象和原型联系起来组成原型链,得以让对象可以访问到不属于自己的属性 - 实例对象的
_proto_
如何产生的:当我们使用new
操作符时,生成的实例对象拥有了_proto_
属性 Object.prototype.__proto__ === null
Object.__proto__ === Function.prototype
Function.__proto__ === Function.prototype
fn.__proto__ === Fn.prototype
四:原型链
- 对象的
__proto__
属性指向原型,__proto__
将对象和原型连接起来组成了原型链 - 具体起来说就是:访问一个对象的属性时,先在基本属性中查找,如果没有,再沿着
__proto__
这条链向上找,这就是原型链
总结
-
Object
是所有对象的爸爸,所有对象都可以通过__proto__
找到它 -
Function
是所有函数的爸爸,所有函数都可以通过__proto__
找到它 - 函数的
prototype
是一个对象 -
Function.prototype
和Object.prototype
是两个特殊的对象,他们由引擎来创建 - 除了以上两个特殊对象,其他对象都是通过构造器
new
出来的 - 对象的
__proto__
指向原型,__proto__
将对象和原型连接起来组成了原型链
参考资料:
深度解析原型中的各个难点
网友评论