我是学习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();
答案 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