[[Prototype]] vs原型:..有什么区别?(MyCons .__ proto__ === MyCons.prototype)等于FALSE

Jan*_*ray 6 javascript prototype prototype-programming

看来这里有区别......

让我们说我们有 function MyConstructor() {}

MyConstructor [[Prototype]]是Function.prototype,而不是 MyConstructor.prototype.

在其他(非标准/"console.log-able")字样中:
MyConstructor.__ proto__ 不是 MyConstructor的MyConstructor.prototype

试试这个:

function MyConstructor() {};
(MyConstructor.__proto__ === MyConstructor.prototype); //false?! why?
Run Code Online (Sandbox Code Playgroud)

为什么会这样?有人能解释一下这个区别吗?

Dag*_*bit 12

想想这样.MyConstructor是一个函数对象,所以它是由Function; 创建的; 因此它[[Prototype]](或__proto__)与...相同Function.prototype.

以同样的方式,var myObj = new MyConstructor()创建一个myObj具有[[Prototype]]相同的对象MyConstructor.prototype.

换句话说,函数有一个prototype属性,当你调用函数时new,它们将构造一个[[Prototype]]与构造函数的prototype属性相同的对象...但是函数的prototype属性与它的[[Prototype]](或__proto__)属性不同,因为一个函数遵循与其他对象相同的规则,并[[Prototype]]从构造它的函数中获取其内部属性(这总是Function偶然).


进一步解释,[[Prototype]]并prototype有完全不同的目的.[[Prototype]]在解析对象的属性时使用.如果一个对象没有属性,[[Prototype]]则检查它,然后检查该对象[[Prototype]],依此类推,直到找到属性或者你到达原型链的末尾.

相反,prototype是将[[Prototype]]属性分配给对象的机制,因为除非使用非标准__proto__属性,否则无法直接访问它们.

由于函数是对象,因此它们具有[[Prototype]]内部属性,用于解析属性,与普通对象一样,以及prototype属性,该属性被指定为[[Prototype]]函数构造的新对象.