我只是在尝试用 Javascript 进行子类化的想法。我喜欢假装扩展 native 对象(如数组、字符串等)是一个坏主意。无论事实如何,这完全超出了我的理解范围。
话虽如此,让我们继续吧。
我想做的是扩展数组(现在,扩展
可能不是我正在做的事情的正确术语)
我想创建我的新类 MyArray
并且我想在它上面有 2 个方法。 .add
和 .addMultiple
。
所以我是这样实现的。
function MyArray(){
var arr = Object.create(Array.prototype);
return Array.apply(arr, arguments);
}
MyArray.prototype = Array.prototype;
MyArray.prototype.add = function(i){
this.push(i);
}
MyArray.prototype.addMultiple = function(a){
if(Array.isArray(a)){
for(var i=0;i<a.length;i++){
this.add(a[i]);
}
}
}
这工作正常,但如果我这样做
console.log(Array.prototype.addMultiple );
console.log(Array.prototype.add);
我得到[Function]
和[Function]
。
所以这意味着我的代码正在修改 native Array 对象。我试图避免的事情。如何更改此代码,使这两个 console.log
会给我 undefined
但我仍然能够使用 native Array.prototype
方法,如 .push
?
TIA
最佳答案
您应该设置正确的原型(prototype)链:
function MyArray(){
Array.apply(this, arguments);
}
MyArray.prototype = Object.create(Array.prototype);
Object.create只是创建具有指定原型(prototype)的新对象,因此在此操作之后以下内容为真:
MyArray.prototype !== Array.prototype; // true
Object.getPrototypeOf(MyArray.prototype) === Array.prototype; // true
关于javascript - 无法扩展 javascript 原型(prototype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39371020/