2017-05-10 60 views
3

我想使財產可調或不可調。因此,例如:使財產可以調用或不調用

function Test() { 
    var obj = { someString: 'here is text' }; 

    Object.defineProperty(obj, 'string', { 
    get: function() { 
     return obj.someString; 
    }, 
    set: function() { 
     return function(val) { 
     obj.someString = val; 
     } 
    } 
    }); 

    return obj; 
} 

var test = new Test(); 

這樣,我可以這樣做:

test.string // initially returns 'here is text'

test.string('new text here') // sets obj.someString to 'new text here'

test.string // returns 'next text here'

上面的代碼目前不發揮作用,我希望它的方式。無論如何在JavaScript中做這樣的事情?或者使用Object.defineProperty或不使用

+1

什麼用的情況下,這種行爲? –

+0

@shambalambala我在這裏提出了一個更好的問題:http://stackoverflow.com/questions/43923053/how-to-make-a-property-method-invokable-or-not – georgej

回答

0

我不確定是否有可能這樣做。相反,如果一個函數的參數設置,你可以做的條件,如果它不具備的功能讀取屬性:

function Test() { 
    var obj = { 
    someString: 'here is text', 
    string: function(val) { 
     if(val == undefined) { // If the val parameter was not defined 
     return this.someString; // Just return the property someString 
     } else { // Otherwise, 
     this.someString = val; 
     } 
    } 
    }; 
    return obj; 
} 

var Tmp = new Test(); 
console.log(Tmp.string()); // This outputs 'here is text' 
Tmp.string('New text!'); // This sets someString to 'New Text!' 
console.log(Tmp.string()); // This outputs 'New Text!' 

這和你想要的之間的主要區別在於不是caling Tmp.string檢索值,你正在調用Tmp.string()。

這裏是我的jsfiddle

0

您可以使用ES6語法:

class Test{ 
    constructor(){ 
    this.someString = "here is text"; 
    } 

    get string(){ 
    return this.someString; 
    } 

    set string(val){ 
    this.someString = val 
    } 
}