假设我的课程定义如下:
class MyClass {
constructor (a) {
this.a = a;
}
_onPropertyChanged() {
// do something
}
}
每当MyClass实例的属性“a”发生变化时,我想在该实例上触发_onPropertyChanged方法。 使用ECMAscript 6实现这一目标的最佳(最高性能)方法是什么?
答案 0 :(得分:3)
没有最好的'方式,实际方法总是取决于最终目标。
以其简单(且表现足够)的形式,它是:
class MyClass {
constructor (a) {
this.a = a;
}
get a() {
return this._a;
}
set a(val) {
this._a = val;
this._onPropertyChanged('a', val);
}
_onPropertyChanged(propName, val) {
// do something
}
}
答案 1 :(得分:1)
这是您可以针对此情况和单个属性执行的操作的简单示例。
class MyClass {
constructor (a) {
this._a = a;
}
set a(value) {
let hasChanged = (this._a !== value);
this._a = value;
//Assumes value is primitive. Customize for objects
if(hasChanged) this._onPropertyChanged();
}
_onPropertyChanged() {
// do something
}
}
答案 2 :(得分:0)
最简单的方法是为previous comment所说的属性定义一个setter和一个getter。但是,如果您已经有一个已定义的setter,它将无效。
另一种方法是非标准的Object.prototype.watch,它只能在Gecko中本地工作。如果您想将其支持带到大多数其他浏览器,您可以使用小而强大的Andrea Giammarchi's library。
答案 3 :(得分:0)
最好的方法是重新定义档案/财产,但在这种情况下,你有一些陷阱,比如找到这个道具的所有者'。你可以使用this解决方案来重新定义完全安全的财产。
如果存在,主要的想法是重新定义属性:
Object.defineProperty(target, name, {
get() { return get(ownPropertyDescriptor.get.call(target)); },
set(val) {
let _val = set.call(this, val);
if (_val != undefined)
ownPropertyDescriptor.set.call(target, _val);
},
configurable: true
});
或者根据symbol
类型创建新属性:
var indexer = Symbol(name);
target[indexer] = target[name];
Object.defineProperty(target, name, {
get() {
var val = target[indexer];
var _val = get(val);
return _val;
},
set(val) {
let _val = set.call(this, val);
arget[indexer] = set(_val);
},
configurable: true
});
Full method is part of complex solution for property-redefining.