将原型上的__defineGetter__和__defineSetter__替换为 defineProperty

replace __defineGetter__ and __defineSetter__ on the prototype with defineProperty

本文关键字:defineSetter 替换 defineProperty defineGetter 原型      更新时间:2023-09-26

我目前使用以下语法来定义一个带有getter和setter的类。

SomeObject = function() {
  this._propertyOne = 'test';
}
SomeObject.prototype.__defineGetter__('propertyOne', function() {
  return this._propertyOne;
});
SomeObject.prototype.__defineSetter__('propertyOne', function(value) {
  this._propertyOne = value;
});

然后我可以像这样访问该属性:

var o = new SomeObject();
o.propertyOne = 'test2';
console.log(o.propertyOne);

如何使用未弃用的 definecProperty 命令或类似命令实现相同的目标?

我尝试了这样的事情:

Object.defineProperty(SomeObject.prototype, 'propertyOne', {
  get: function() {
    return this._propertyOne;
  }.bind(this),
  set: function(value) {
    this._propertyOne = value;
  }.bind(this)
});

但它不起作用。

在你运行Object.defineProperty的那一刻,this值不是你想要的,而是window(或你从中运行该代码段的对象)。所以这是实际发生的事情:

Object.defineProperty(SomeObject.prototype, 'propertyOne', {
  get: function() {
    return this._propertyOne;
  }.bind(window),
  set: function(value) {
    this._propertyOne = value;
  }.bind(window)
});

卸下.bind(this)部分,它应该可以正常工作。