2017-05-27 54 views
4

這可以在構造函數設置:定義GET/

var o = { 
    _foo : "bar", 
    get Foo() { return _foo; }, 
    set Foo(value) { _foo = value; } 
}; 

但我的代碼是在構造函數中定義的,所以我想是這樣的:

function Something(defaultFoo) { 
    var _foo = defaultFoo; 
    get Foo() { return _foo; };    // invalid syntax 
    set Foo(value) { _foo = value; };   // invalid syntax 
} 

var something = new Something("bar"); 
console.log(something.Foo); 

這句法無效。有一些變化是有效的嗎?

回答

5

你可以使用原型屬性,並指定setter和getter。

順便說一句,您需要使用_foo作爲屬性,而不是局部變量。

function Something(defaultFoo) { 
 
    this._foo = defaultFoo; 
 
} 
 

 
Object.defineProperty(Something.prototype, 'foo', { 
 
    get: function() { 
 
     return this._foo; 
 
    }, 
 
    set: function(value) { 
 
     this._foo = value; 
 
    } 
 
}); 
 

 
var something = new Something("bar"); 
 
console.log(something.foo); 
 
something.foo = 'baz'; 
 
console.log(something.foo);

1

您可以用Object.assign這兩個觀念結合起來:

function Something(defaultFoo) { 
    var _foo = defaultFoo; 
    Object.assign(this, { 
     get Foo() { return _foo; }, 
     set Foo(value) { _foo = value; } 
    }); 
} 

確保然而引用_foo一貫這樣,還不如this._foo,因爲你從來沒有定義的。

或者,ES6級符號,你可以做到這一點 - 在這裏我存儲在this._foo值:

class Something { 
    constructor(defaultFoo) { 
     this._foo = defaultFoo; 
    } 
    get Foo() { return this._foo; } 
    set Foo(value) { this._foo = value; } 
}