迷惑javascript的构造函数和原型?

时间:2011-07-19 03:29:39

标签: javascript constructor prototype-programming

function MyObject(){}
Array.prototype={};
MyObject.prototype={};
var a=new Array();
var b=new MyObject();
alert(a.constructor==Array);//true
alert(b.constructor==MyObject);//false

3 个答案:

答案 0 :(得分:9)

Array.prototype是不可写属性。

因此,你的任务:

Array.prototype = {}

...没有成功,所以它的.constructor属性没有改变。

15.4.3.1 Array.prototype

  

Array.prototype的初始值是Array原型对象(15.4.4)。

     

此属性具有属性{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }

...使用自定义构造函数,您可以分配不同的原型对象,因此您已经覆盖了通过.constructor引用构造函数的原始对象。

答案 1 :(得分:2)

当您使用自己的空对象实例覆盖constructor属性时,prototype属性将被覆盖,因为({}).constructor === Object。你可以做任何一件事

function MyObject() {}
MyObject.prototype = {};
MyObject.prototype.constructor = MyObject;

或(更好的IMO)你不能直接设置prototype,而是加强它:

function MyObject() {}
MyObject.prototype.foo = "bar";

另请注意:Array.prototype不可写,因此您的行Array.prototype = {}将无声地失败(或在严格模式下大声失败)。

答案 2 :(得分:0)

> function MyObject(){} 
> Array.prototype={};

您无法为Array.prototype指定值。

> MyObject.prototype={};
> var a=new Array();
> var b=new MyObject();
> alert(a.constructor==Array);//true

Array.prototype 具有构造函数属性,该属性引用 Array 函数。由于a是 Array 的一个实例,因此它继承了 Array.prototype 的构造函数属性。

> alert(b.constructor==MyObject);//false

您已为 MyObject.prototype 分配了一个空对象,它没有原型属性, b 也没有。

MyObject.prototype.constructor = MyObject;

alert(b.constructor==MyObject); // true