2011-04-12 53 views
10

對象屬性我基本上是有一個對象:附加get/set函數在JS

var foo = function() { 
    this.setting = false; 
    this.refresh = function() { ... }; 
} 

let a = new foo(); 
a.setting = true; // a.refresh() is triggered 

我需要觸發刷新隨時.setting被寫入。我覺得它與bind有關,但我無法完全理解。

回答

5

你需要使用一個getter和你的對象二傳手。一種方法是直接使用getter/setter函數:

var foo = function() 
{ 
    this.setting = false; 
    this.getSetting = function() { return this.setting; } 
    this.setSetting = function(val) { this.setting = val; this.refresh(); } 
    this.refresh = function() 
    {...} 
} 

如果您想使用透明foo.setting作爲一個屬性,也有對於語言結構,但遺憾的是他們沒有跨瀏覽器的互操作性。在3年前的迴歸中,Mozilla,Safari,Chrome和Opera支持一種方法,另一種方法是Internet Explorer。這是標準的方法:

http://robertnyman.com/2009/05/28/getters-and-setters-with-javascript-code-samples-and-demos/

IE9有別的事情,我不知道如果它甚至適用於非DOM對象。

+0

啊真正的get/set函數就是我所要做的。不幸的是,這些工作都不在我的平臺上。感謝您的幫助 – ben 2011-04-12 22:29:56

+0

IE9的工作原理與Chrome和FF相同,IE8只支持DOM對象,IE7和更早的版本不支持getter和setter。 – Crisfole 2013-04-23 17:33:01

3

你正在尋找一個設置二傳手嗎?像這樣?

// renamed settings property with underscore 
this._settings = false; 

this.settings = function(s) { 
    if(s !== undefined) { 
     this._settings = s; 
     this.refresh(); 
    } 

    return this._settings; 
}; 

... 


var f = new foo(); 
f.setSettings(mySettings); 

我傾向於將我的getter和setter組合成JavaScript中的一種方法,因爲它很容易做到。這個缺點是_settings仍然是公開的對象,任何人都可以直接寫入它。隱藏它的唯一方法是使用閉包,這需要完全不同的方法來創建對象。

+0

啊,這是我現在,我希望我可以只讓_settings公開和隱藏的get/set功能 – ben 2011-04-12 22:15:55

3

如果你不與舊的瀏覽器限制,你可以嘗試使用方法描述here

3

我不是你爲什麼試圖使用「新」運算符,你會更好地使用對象文字。現在,如果你正在尋找類似的,比方說,C#的屬性,你可以做這樣的事情:

var myObject = function(){ 
    //Private Members 
    var myProperty = ''; 

     //Privileged Setter 
     this.setMyProperty = function(value){ 
      myProperty = value; 
     }; 

     //Privileged Getter 
     this.getMyProperty = function(){ 
      return myProperty; 
     } 

} 

var MyNewObject = new myObject(); 
MyNewObject.setMyProperty("Hello, World!"); 
MyNewObject.getMyProperty(); 

欲瞭解更多信息,我建議這樣的:http://www.crockford.com/javascript/private.html

+3

-1您使用'new'運算符來正確設置原型... https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/new – Crisfole 2013-04-23 17:35:38

13

您可以使用JavaScript getter和setter。見the MDC documentation on the subjectJohn Resig's blog post on the subject。請注意,並非所有瀏覽器都支持此功能。

var Foo = function()//constructor 
{ 
    this._settings = false;//hidden variable by convention 
    this.__defineGetter__("settings", function(){ 
    return _settings;//now foo.settings will give you the value in the hidden var 
    }); 

    this.__defineSetter__("settings", function(s){ 
     _settings = s;//set the hidden var with foo.settings = x 
     this.refresh();//trigger refresh when that happens 
    }); 

    this.refresh = function(){ 
     alert("Refreshed!");//for testing 
    } 
} 

var a = new Foo();//create new object 
a.settings = true;//change the property 
//a.refresh() is triggered 

Try it!

1

我知道這是一個已經回答了一個老問題,但我想提供一個解決方案,將JavaScript的最新語法的優勢。


定義classgettersetter

class Foo { 
    constructor() { 
    this._setting = false; 
    } 

    get setting() { 
    return this._setting; 
    } 

    set setting(value) { 
    this._setting = value; 
    this.refresh(); 
    } 

    refresh() { 
    console.log("refresh!"); 
    } 
} 

let foo = new Foo(); 
foo.setting = true; // foo.refresh() is called