【问题标题】:What is alternative before ES6 of getter method existing in ES6ES6 中存在的 getter 方法在 ES6 之前有什么替代方法
【发布时间】:2016-12-21 23:19:26
【问题描述】:

ES6 中的 Getter 方法被定义为 METHOD 并被称为 ATTRIBUTE(调用 obj.method 而不是 obj.method(..)

例子:

class Job  {
    constructor(){
        this.start=new Date();
    }

    get age(){
        return new Date()-this.start;
    }
}

然后:

var vm=new Job();
//....
vm.age // call Getter method  

我的问题是:如果有的话,ES6 之前的替代方案是什么?

【问题讨论】:

  • 不是方法,也不是称为属性,而是“称为属性”。
  • @torazaburo:你删除了太多的空白;)

标签: javascript ecmascript-6 getter es5-shim


【解决方案1】:

从 ES5 开始,您已经能够使用 Object.defineProperty 定义 getter 和 setter。您的 ES6 代码本质上是以下 ES5 代码的语法糖:

function Job ( ) {
    this.start = new Date;
}

Object.defineProperty( Job.prototype, 'age', {
  get: function ( ) { return new Date - this.start; }
} );

在此之前,某些引擎对 getter 具有非标准支持,例如 Object.prototype.__defineGetter__,它会像这样用于复制您的功能:

Job.prototype.__defineGetter__( 'age', function ( ) {
  return new Date - this.start;
} );

SpiderMonkey 也有一些其他方法可以做到这一点,甚至更早:

Job.prototype.age getter = function() {
    return new Date - this.start;
};

// or, this one, which declares age as a variable in the local scope that acts like a getter

getter function age() { ... };

除了Object.defineProperty 在 ES6 中仍然非常有用之外,今天不应该使用这些方法。

【讨论】:

  • 而且语法在 ES5 的对象字面上也可用!
【解决方案2】:

从 ES5 开始,对象的每个属性都有一个 Getter 和 Setter 函数。 你可以在这里找到完整的文档:MDN - Object.defineProperty()

当您创建一个对象时,您可以定义一个新属性并告诉在获取和设置该值时要使用哪些函数:

var obj = {};

Object.defineProperty( obj, 'propName', {
  get: function() { return 42; },
  set: function(newValue){ this.propName = newValue; }
});

在您的 ES6 代码中,您正在做的是定义一个新的构造函数,然后为 age 定义 getter。

【讨论】:

    猜你喜欢
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 2017-03-21
    • 2019-03-19
    • 2016-12-05
    • 1970-01-01
    • 2016-07-04
    相关资源
    最近更新 更多