javascript - 如何添加推送到返回过滤数组的 getter 的功能?

标签 javascript arrays typescript class

我有一个类,它有一个私有(private)数组和一个返回所述数组的过滤版本的 getter。我希望能够简单地调用已过滤数组的推送,这将更新底层数组,而不必直接调用底层数组。我尝试过访问数组原型(prototype),但不太清楚该怎么做。

这是一个代码片段来模拟我想要做的事情:

class Test {
	_foo: number[];
  
  constructor() {
  	this._foo = [1,2,3,4,5];
  }
  
  get foo(): number[] {
  	return this._foo.filter(x => {
    	return x > 2;
    });
  }
}

let obj = new Test();
obj.foo.push(6);

console.log(obj);
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.min.js"></script>

如有任何建议,我们将不胜感激。

最佳答案

通过覆盖替代:

const {create} = Object;

class Test {
  _foo: number[];
  _push: Object;

  constructor() {
    this._foo = [1,2,3,4,5];
    this._push = {push: {value: this._foo.push.bind(this._foo)}};
  }

  get foo(): number[] {
    return create(this._foo.filter(x => x > 2), this._push);
  }
}

let obj = new Test();
obj.foo.push(6);

console.log(obj.foo.slice()); // 3,4,5,6

您也可以直接使用:

  get foo(): number[] {
    const filtered = this._foo.filter(x => x > 2);
    filtered.push = this._foo.push.bind(this._foo);
    return filtered;
  }

或者在构造函数中将 this._push 作为函数分配一次并执行相同的操作,但这可能会在某些 JS 引擎(即 v8)中进行去优化

关于javascript - 如何添加推送到返回过滤数组的 getter 的功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57776382/

相关文章:

arrays - 如果 var 似乎在 Swift 中深度复制数组。如果让?

typescript :TS7006:参数 'xxx' 隐式具有 'any' 类型

javascript - 这是在构造函数之外未定义的

javascript - 如何在 Google Chart 中设置轴步长?

javascript - 无法更改 CSS 中的下拉列表选项高度

sql - postgreSQL 查询 jsonb 列中的空数组字段

c# - 将具有一对多关系的 .Net 核心实体映射到 Angular 2 接口(interface)

Javascript - 使用从 ajax 休息响应接收到的一些值填充输入框

javascript - 如何将字符串化的 surveyjs 类 JSON 对象转换为实际的 JSON

php - json_encode 将 php 数组传递给 javascript 数组