无法扩展JavaScript原型
我只是玩弄用Javascript创建子类的想法。我喜欢假装扩展本地对象(如数组,字符串等)是一个坏主意。无论如何,这完全不在我的理解之中。无法扩展JavaScript原型
话虽如此,让我们继续吧。
我试图做的是延长阵列(现在,extend
可能不是正确的术语,我在做什么)
我要创建我的新类,我想有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]
。 所以这意味着我的代码正在修改本地Array
对象。我正在努力避免的事情。如何以这两个console.log
s会给我undefined
的方式更改此代码,但我仍然可以使用像.push
这样的原生Array.prototype
方法?
TIA
,您应该设置适当的原型链:
function MyArray(){
Array.apply(this, arguments);
}
MyArray.prototype = Object.create(Array.prototype);
Object.create刚刚创建具有指定原型的新对象,所以在这之后的操作以下为真:
MyArray.prototype !== Array.prototype; // true
Object.getPrototypeOf(MyArray.prototype) === Array.prototype; // true
此:
MyArray.prototype = Array.prototype;
导致MyArray.prototype指向与Array.prototype相同的对象。因此,之后对MyArray.prototype执行的所有操作也将完成Array.prototype。
解决这是阵列的原型的浅表副本,而不是存储在MYARRAY甲方式:
MyArray.prototype =克隆(Array.prototype);
我复制从这里:
谢谢,我来看看 – AdityaParab
使用类extension
class MyArray extends Array {
add(i) {
this.push(i);
return this;
}
addMultiple(a) {
if (Array.isArray(a)) {
for (var i = 0; i < a.length; i++) {
this.add(a[i]);
}
}
return this;
}
}
var test = new MyArray();
test.addMultiple([1,2,3,4,5]).add(6).add(7);
console.log(test, test.indexOf(6));
谢谢,我想用ES5来做! – AdityaParab
Object.create(Array.prototype);
这只是创建一个新对象,并返回objec TS。
因此,根据你的场景,你刚刚创建了数组对象,并添加了一些方法到你的数组对象 - MyArray。它会影响本机阵列。
你只是在修改你的克隆对象。
说'函数MyArray'(构造函数)的当前内容不是真的有必要吗? – Katana314
不,这样做不会允许我执行'MyArray.prototype.add'。 '.add'将是未定义的。 – AdityaParab
@ Katana314:不!构造函数中的'var arr = Object.create(Array.prototype);'只是表示'var arr = []'的明确方式; – AdityaParab