"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 方式扩展本机数组的行为。您将基本上以不破坏浏览器的方式扩展本机数组的原型。