2016-08-15 99 views
1

getter方法被定義爲METHOD &稱爲屬性之前什麼是替代(調用的obj.method代替obj.method(..)getter方法的ES6在ES6存在於ES6

實施例:

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

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

然後:

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

我的問題是:在ES6之前有什麼替代方案?

+1

不是一種方法,而不是*稱爲ATTRIBUTE *,而是「稱爲屬性」。 – 2016-08-15 18:44:07

+0

@torazaburo:你刪除了太多的空格;) –

回答

4

自ES5以來,您可以使用Object.defineProperty定義獲取者和設置者。你ES6代碼基本上以下ES5代碼語法糖:

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

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

在此之前,一些發動機已經爲干將非標準的支持,如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中仍然非常有用。

+1

ES5中的對象文字也有語法可用! – loganfsmyth

1

由於ES5對象的每個屬性都具有Getter和Setter函數。 你可以找到完整的文檔在這裏:MDN - Object.defineProperty()

當你創建一個對象,你可以再定義一個新的屬性,並告訴要使用的功能,獲取和設置,當該值:

var obj = {}; 

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

在你ES6代碼你正在做的是定義一個新的構造函數,然後爲age定義get ter。