这里看起来有点不同......
假设我们有function MyConstructor() {}
MyConstructor的[[Prototype]]
为Function.prototype
,不 MyConstructor.prototype.
在其他(非标准/“console.log-able”)字样中:
MyConstructor.__ proto__
不是 MyConstructor的MyConstructor.prototype
尝试:
function MyConstructor() {};
(MyConstructor.__proto__ === MyConstructor.prototype); //false?! why?
为什么会这样?有人可以向我解释差异吗?
答案 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)
此代码将非常清楚地显示:
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;
Chrome控制台是:
意思是:
一个。在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;