我正在更深入地研究JavaScript。我知道可以通过修改原型来修改/增强JavaScript对象的行为。
出于特殊目的,我想使用Array并向其中添加各种行为。我完全可以为我的情况更改所有数组。但是它是普通的面向对象语言,我可以扩展它,添加我的功能,而不必考虑原始语言。 JS有什么可比的吗?像这样,我可以复制Array原型并将其放到另一个类中吗,而不会影响其他数组吗?还是有什么想法?
不是很重要,但这会有所帮助,并且肯定会帮助我加深对JS的理解,这是我在Java,C ++等多年后才真正接触到的。
答案 0 :(得分:1)
您可以扩展Array类,并将额外的功能实现为该类上的方法。
您现在使用let x = [];
代替了let y = new myArray();
。
class myArray extends Array {
constructor() {
super();
console.log(typeof this.push);
console.log(typeof this.shift);
}
logAndAdd(variable) {
this.push(variable);
console.log(variable);
}
}
let y = new myArray();
y.logAndAdd('hi');
答案 1 :(得分:0)
我认为看看Javascript迭代器及其可能性是一种选择。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols
我在Typescript / Angular2中使用了这种方法来实现类似数组的集合,在这里我可以以类似OO的方式定义自定义的push / pop / pull操作。
答案 2 :(得分:0)
是的,您可以执行此操作,在JavaScript中,我们将此类似于界面的事物称为prototype。
Function.prototype.method = function(name, func) {
this.prototype[name] = func;
return this;
};
尽管就我个人而言,我通常更喜欢使“方法”成为一个接受并返回数组的独立函数。
答案 3 :(得分:0)
我认为您可以像使用其他任何OO语言一样简单地使用ES6 extends
。
这是扩展本地数组并添加log方法的类的示例。唯一的问题是,您将必须使用new
关键字来创建新的数组。
class CustomArray extends Array {
log() {
console.log(this);
}
}
var customArrayInstance = new CustomArray();
customArrayInstance.push(1,2,3,4,5);
customArrayInstance.log();
// Creating an array using the array constructor
//
new CustomArray(200).fill(null).log()
您还可以使用Symbols
以非OOP方式扩展本机数组的行为。您将基本上以一种不会破坏浏览器的方式扩展本机数组的原型。