3

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 之前的替代方案是什么?

4

2 回答 2

7

从 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 中仍然非常有用的方法。

于 2016-08-15T18:07:14.800 回答
3

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

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

var obj = {};

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

在您的 ES6 代码中,您正在做的是定义一个新的构造函数,然后getage.

于 2016-08-15T18:15:04.497 回答