"Extend"像传统 OO 语言中的 JS 数组?
"Extend"JS Array like in traditional OO languages?
我正在深入研究 Java脚本。我知道可以通过修改原型 modify/enhance JavaScript 对象的行为。
出于特殊目的,我想使用 Array 并向其添加各种行为。我完全明白为我的情况更改所有数组是不好的。但它是常规的 OO 语言,我可以扩展它,添加我的功能,而不管原来的。 JS中有什么可比的吗?比如,我可以复制数组原型并将其放到另一个 class & fiddle 上而不影响其他数组吗?或者有什么想法?
不重要,但它会有所帮助,肯定会帮助我更深入地了解 JS,我在 Java、C++ 等多年后真正进入了这个领域
我认为看一看 Javascript 迭代器及其可能性是一种选择。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols
我在 Typescript/Angular2 中使用了这种方法来实现类似数组的集合,我可以在其中以类似 OO 的方式定义自定义 push/pop/pull 操作。
是的,您可以这样做,在 JavaScript 中,我们将这种类似界面的东西称为 prototype。
Function.prototype.method = function(name, func) {
this.prototype[name] = func;
return this;
};
尽管就我个人而言,我通常更愿意使 "method" 成为一个独立的函数,并且 returns 是一个数组。
您可以扩展数组 class 并将您的额外功能实现为 class 上的方法。
您现在使用 let y = new myArray();
,而不是 let x = [];
。
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');
我认为您可以像使用任何其他 OO 语言一样简单地使用 ES6 extends
。
这里是一个 class 的示例,它扩展了本机数组并添加了一个日志方法。唯一的问题是您必须使用 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 方式扩展本机数组的行为。您将基本上以不破坏浏览器的方式扩展本机数组的原型。
我正在深入研究 Java脚本。我知道可以通过修改原型 modify/enhance JavaScript 对象的行为。
出于特殊目的,我想使用 Array 并向其添加各种行为。我完全明白为我的情况更改所有数组是不好的。但它是常规的 OO 语言,我可以扩展它,添加我的功能,而不管原来的。 JS中有什么可比的吗?比如,我可以复制数组原型并将其放到另一个 class & fiddle 上而不影响其他数组吗?或者有什么想法?
不重要,但它会有所帮助,肯定会帮助我更深入地了解 JS,我在 Java、C++ 等多年后真正进入了这个领域
我认为看一看 Javascript 迭代器及其可能性是一种选择。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols
我在 Typescript/Angular2 中使用了这种方法来实现类似数组的集合,我可以在其中以类似 OO 的方式定义自定义 push/pop/pull 操作。
是的,您可以这样做,在 JavaScript 中,我们将这种类似界面的东西称为 prototype。
Function.prototype.method = function(name, func) {
this.prototype[name] = func;
return this;
};
尽管就我个人而言,我通常更愿意使 "method" 成为一个独立的函数,并且 returns 是一个数组。
您可以扩展数组 class 并将您的额外功能实现为 class 上的方法。
您现在使用 let y = new myArray();
,而不是 let x = [];
。
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');
我认为您可以像使用任何其他 OO 语言一样简单地使用 ES6 extends
。
这里是一个 class 的示例,它扩展了本机数组并添加了一个日志方法。唯一的问题是您必须使用 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 方式扩展本机数组的行为。您将基本上以不破坏浏览器的方式扩展本机数组的原型。