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

时间:2012-02-26 09:15:02

标签: 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?

为什么会这样?有人可以向我解释差异吗?

3 个答案:

答案 0 :(得分:11)

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

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

换句话说,函数具有prototype属性,当您使用new调用函数时,它们将构造一个与构造函数[[Prototype]]相同的对象prototype 1}} property ...但是函数的prototype属性与其[[Prototype]](或__proto__)属性不同,因为函数遵循与其他对象相同的规则并获取它构造它的函数的内部[[Prototype]]属性(顺便说一下,它总是Function。)


为了进一步解释,[[Prototype]]prototype的用途完全不同。解析对象的属性时使用[[Prototype]]。如果对象没有属性,则检查其[[Prototype]],然后检查该对象的[[Prototype]],依此类推,直到找到属性或者到达原型链的末尾。< / p>

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

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

答案 1 :(得分:1)

此代码将非常清楚地显示:

&#13;
&#13;
var obj = {};
var arr = [];
var fun = function() {};    

A:     
console.log(obj.prototype);
console.log(arr.prototype);
console.log(fun.prototype);

B:
console.log(arr.__proto__);
console.log(fun.__proto__);

C:
console.log(obj.__proto__);
console.log(arr.__proto__.__proto__);
console.log(fun.__proto__.__proto__);
console.log(fun.prototype.__proto__);
&#13;
&#13;
&#13;

Chrome控制台是:

enter image description here

意思是:

一个。在JavaScript&#39;原型&#39;是一个特殊的对象,只存在于函数中 - 用于创建函数构造函数(对于你的问题 - 这就是为什么&#39;原型&#39;它不等于&#39; proto &#39;。)

B中。阵列和功能让他们拥有&#39; proto &#39;他们用JavaScript内置的所有礼仪和方法。

℃。 JavaScript中的所有内容都是真正的内部对象,所以&#39;原型。 proto &#39;功能,或&#39; 原型原型&#39;函数和数组都等于&#39; proto &#39;一个对象。

答案 2 :(得分:0)

受到另一个答案的启发,并完成它:

var obj = {name: 'Ali'};
var arr = [1, 2, 3];
var date = new Date();
var func = function(){console.log('Hi!')};
var arrowFunc = ()=>{};

obj.prototype === undefined;
arr.prototype === undefined;
date.prototype === undefined;
func.prototype != undefined;
func.hasOwnProperty('prototype') === true;
arrowFunc.prototype === undefined;
arrowFunc.hasOwnProperty('prototype') === false;

obj.__proto__ === Object.prototype;
arr.__proto__ === Array.prototype;
date.__proto__ === Date.prototype;
func.__proto__ === Function.prototype;
arrowFunc.__proto__ === Function.prototype;

Array.prototype.__proto__ === Object.prototype;
Date.prototype.__proto__ === Object.prototype;
Function.prototype.__proto__ === Object.prototype;

Object.prototype__proto__ === undefined;