将新Array分配给NodeList.prototype

时间:2015-08-07 12:55:16

标签: javascript dom

当我将NodeList.prototype设置为Array object时,为什么无法继承数组道具和方法 - NodeList.prototype = new Array;我可以用我的自定义构造函数原型来做到这一点?为什么第一个a对象不继承数组方法而aa呢? 有关这方面的任何解释或博客文章链接都是受欢迎的。

function A(a) {
 this.a = a;
}

A.prototype.b = 'b';

var a = new A('a');

A.prototype = new Array; // aa instance will now have map, filter, some ...

var aa = new A('aa');

2 个答案:

答案 0 :(得分:1)

它不起作用,因为原型链是在施工时设置的。调用A.prototype = new Array;只会影响之后创建的实例。

要在实例化对象后更改对象的原型,可以使用Object.setPrototypeOf(a)

最后,请注意,在您的示例中,您将删除现有原型,因此A的所有新实例都不会具有原始b: "b"属性。

答案 1 :(得分:1)

更改本机对象的原型(例如NodeList)总是有风险的。它可能会也可能不会奏效。扩展原型或扩展实际对象要好得多。

NodeList.prototype.map = Array.prototype.map;
// or:
someNodeList.map = Array.prototype.map;

并且为了夸大你的例子:当你创建一个新对象时,它会获取构造函数的原型并将其引用存储到它的__proto__属性中。因此,如果您完全替换某些构造函数的原型,它将仅影响新创建的对象,因为它们将引用新原型。