function MyObject(){}
Array.prototype={};
MyObject.prototype={};
var a=new Array();
var b=new MyObject();
alert(a.constructor==Array);//true
alert(b.constructor==MyObject);//false
答案 0 :(得分:9)
Array.prototype
是不可写属性。
因此,你的任务:
Array.prototype = {}
...没有成功,所以它的.constructor
属性没有改变。
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