像传统的OO语言一样“扩展” JS Array?

时间:2018-12-17 15:33:39

标签: javascript inheritance prototype

我正在更深入地研究JavaScript。我知道可以通过修改原型来修改/增强JavaScript对象的行为。

出于特殊目的,我想使用Array并向其中添加各种行为。我完全可以为我的情况更改所有数组。但是它是普通的面向对象语言,我可以扩展它,添加我的功能,而不必考虑原始语言。 JS有什么可比的吗?像这样,我可以复制Array原型并将其放到另一个类中吗,而不会影响其他数组吗?还是有什么想法?

不是很重要,但这会有所帮助,并且肯定会帮助我加深对JS的理解,这是我在Java,C ++等多年后才真正接触到的。

4 个答案:

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