[英]Confused by javascript's constructor and prototype?
function MyObject(){}
Array.prototype={};
MyObject.prototype={};
var a=new Array();
var b=new MyObject();
alert(a.constructor==Array);//true
alert(b.constructor==MyObject);//false
Array.prototype
是不可寫的屬性。
因此,您的任務:
Array.prototype = {}
...沒有成功,所以它的.constructor
屬性沒有改變。
Array.prototype
的初始值為 Array 原型 object (15.4.4)。此屬性具有屬性
{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }
...而使用您的自定義構造函數,您可以分配不同的原型 object,因此您已經覆蓋了通過.constructor
引用構造函數的原始原型。
當您使用自己的空 object 實例覆蓋prototype
屬性時, constructor
屬性將被覆蓋,因為({}).constructor === Object
。 你可以做
function MyObject() {}
MyObject.prototype = {};
MyObject.prototype.constructor = MyObject;
或者(更好的 IMO)你不能直接設置prototype
,而是增加它:
function MyObject() {}
MyObject.prototype.foo = "bar";
另請注意: Array.prototype
不可寫,因此您的行Array.prototype = {}
將靜默失敗(或在嚴格模式下大聲失敗)。
> function MyObject(){}
> Array.prototype={};
你不能給 Array.prototype 賦值。
> MyObject.prototype={};
> var a=new Array();
> var b=new MyObject();
> alert(a.constructor==Array);//true
Array.prototype有一個構造函數屬性,它引用了數組function。 由於 a 是Array的一個實例,它繼承了Array.prototype的 constructor 屬性。
> alert(b.constructor==MyObject);//false
您已將一個空的 object 分配給MyObject.prototype ,它沒有原型屬性,也沒有b 。
MyObject.prototype.constructor = MyObject;
alert(b.constructor==MyObject); // true
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.