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

标签 javascript

我刚开始学习 JavaScript 中的继承概念。在这种情况下,我想继承 Array 对象并向其添加功能。
我在这里面临的问题是第三个方法正确执行,但 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();

最佳答案

问题在于您的代码试图用仅具有您分配的属性的普通对象替换内置原型(prototype)(其本身是一个数组)。不要替换原型(prototype),而是向已有的原型(prototype)添加属性,例如

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

此外,由于您在替换 Array.prototype 之前创建了 a 数组,因此它得到的是旧原型(prototype),而不是新原型(prototype)(如果添加了新原型(prototype)) )。这两种方法都会抛出错误,而不仅仅是show。如果您创建a之前更改原型(prototype),则它在允许覆盖内置原型(prototype)的浏览器中“有效”。它在 ECAMScript ed 3(或更早版本)实现或更高版本中不起作用,其中 Array.prototype 具有属性:

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

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

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

这样您就可以根据需要添加属性并覆盖内置方法。

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

关于javascript - 关于javascript中继承数组对象的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32375073/

相关文章:

javascript - 视觉 : How to display each "leaf" of an array of nested objects in a table?

javascript - componentDidUpdate 中的 setState 将 prev 与当前状态进行比较,无法使用新数据重新呈现页面,也会出现无限循环

javascript - 将 JSON 数据本地加载到 JavaScript 文件中

javascript - 使用 Ajax 请求(无 PHP)使用 HTML、javascript 和 jQuery 将图像上传到 Amazon s3

javascript - CSS-Animation 后如何链接?

javascript - 字符串将双引号替换成大括号

javascript - 循环内的“page.evaluate()”(在 Puppeteer 中)返回相同的值

javascript - HTML5 视频上方无法选择的文本

javascript - TypeScript 升级(v3 到 v4)后 Storybook 中断

javascript - 如果我更改设备时间,如何获取实际的世界时间?