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

About inheriting the properties of the array object in javascript

本文关键字:数组 对象 属性 继承 javascript      更新时间:2023-09-26

我刚开始学习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();

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

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

同样,由于在替换 array之前创建了一个数组。Prototype ,它得到的是旧原型,而不是新原型(如果添加了新原型)。这两种方法都会抛出错误,而不仅仅是show。如果你在创建之前修改原型,它会在允许覆盖内置原型的浏览器中"工作"。它将不能在ECAMScript ed 3(或更早)实现中工作,也不能在Array中工作。原型有以下属性:

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

所以你不能替换它并且对象本身有属性:

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

如果你愿意,你可以添加属性和覆盖内置方法。

请注意,扩展内置对象通常会受到警告,请参阅扩展内置本机。

可以这样做:

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();

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

if (!('third' in Array.prototype)) {
  Array.prototype.third = function () {
    return this[2];
  };
}
[0, 1, 2, 3].third(); // 2
演示