关于在javascript中继承数组对象的属性

时间:2015-09-03 12:01:46

标签: javascript

我是学习JavaScript中的继承概念的新手。在这种情况下,我想继承Array对象并为其添加功能 我在这里遇到的问题是third方法正确执行,但show()方法抛出错误,指出show()不是函数。

var a = [1,2,3,4,5];
Array.prototype = {
    third:function(){
        console.log(a[3]);
    },
    show:function(){
        console.log(a);
    }
};
a.third();
a.show();

3 个答案:

答案 0 :(得分:2)

问题是你的代码试图用只有你指定的属性的普通对象替换内置原型(它本身就是一个数组)。不要替换原型,而是将属性添加到已经存在的属性,例如

Array.prototype.third = function() {
    console.log(a[3]);
}

此外,由于您在替换 Array.prototype 之前创建了 a 数组,因此它获取的是旧原型,而不是新原型(如果添加了新原型) )。这两种方法都会抛出错误,而不仅仅是 show 。如果您在创建 a 之前更改原型,它将在允许覆盖内置原型的浏览器中“正常工作”。它不适用于ECAMScript ed 3(或可能更早)的实现,或者以后 Array.prototype 具有属性:

{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }

因此您无法替换它并且对象本身具有属性:

{ [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }

所以你可以添加属性并覆盖内置方法。

请注意,通常会警告扩展内置对象,请参阅Extending builtin natives. Evil or not?

答案 1 :(得分:0)

而不是那样,试试这种方式:

var array = [1,2,3,4,5];
Array.prototype.third = function () { console.log(this[3]); }
Array.prototype.show = function () { console.log(this); }
array.third();
array.show();

答案 2 :(得分:0)

如果你要为原生原型添加方法,你真的需要检查一下,这样你就可以确定你没有覆盖任何重要的东西。所以,举个例子并稍微改变一下:

if (!('third' in Array.prototype)) {
  Array.prototype.third = function () {
    return this[2];
  };
}

[0, 1, 2, 3].third(); // 2

DEMO