簡體   English   中英

對 javascript 的構造函數和原型感到困惑?

[英]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屬性沒有改變。

15.4.3.1 Array.prototype

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM