对象观察 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/observe将最有可能dropped https://esdiscuss.org/topic/an-update-on-object-observe. 对象.watch https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/watch仅在 Gecko 中受支持,因此除非您仅针对 Firefox,否则请勿在代码中使用它。
这意味着您必须编写自己的事件发射。如果您喜欢,可以使用 TypeScript getter 和 setter:
class Entity {
private entitityListener:EntityPositionListener;
private _pos:number[] = [];
get pos():number[] {
return this._pos;
}
set pos(value:number[]) {
this._pos = value;
if (this.entitityListener) {
this.entitityListener.reportEvent('pos', value);
}
}
}
class SuperEntity extends Entity {
}
let superEntity = new SuperEntity();
superEntity.pos = [1,2]; // this will call 'this.entitityListener.reportEvent()' and you don't need superEntity.setPos([1,2]);
其转换为:
var __extends = (this && this.__extends) || function (d, b) {
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
var Entity = (function () {
function Entity() {
this._pos = [];
}
Object.defineProperty(Entity.prototype, "pos", {
get: function () {
return this._pos;
},
set: function (value) {
this._pos = value;
if (this.entitityListener) {
this.entitityListener.reportEvent('pos', value);
}
},
enumerable: true,
configurable: true
});
return Entity;
})();
var SuperEntity = (function (_super) {
__extends(SuperEntity, _super);
function SuperEntity() {
_super.apply(this, arguments);
}
return SuperEntity;
})(Entity);
var superEntity = new SuperEntity();
superEntity.pos = [1, 2];
您可以使用对象.defineProperty() https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty#Enumerable_attribute定义 getter 和 setter,这意味着您可以定义 setter 来包含对EntityListener
method.