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









