對象屬性我基本上是有一個對象:附加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
有關,但我無法完全理解。
對象屬性我基本上是有一個對象:附加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
有關,但我無法完全理解。
你需要使用一個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對象。
你正在尋找一個設置二傳手嗎?像這樣?
// 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
仍然是公開的對象,任何人都可以直接寫入它。隱藏它的唯一方法是使用閉包,這需要完全不同的方法來創建對象。
啊,這是我現在,我希望我可以只讓_settings公開和隱藏的get/set功能 – ben 2011-04-12 22:15:55
如果你不與舊的瀏覽器限制,你可以嘗試使用方法描述here
我不是你爲什麼試圖使用「新」運算符,你會更好地使用對象文字。現在,如果你正在尋找類似的,比方說,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
-1您使用'new'運算符來正確設置原型... https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/new – Crisfole 2013-04-23 17:35:38
您可以使用JavaScript getter和setter。見the MDC documentation on the subject和John 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
我知道這是一個已經回答了一個老問題,但我想提供一個解決方案,將JavaScript的最新語法的優勢。
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
啊真正的get/set函數就是我所要做的。不幸的是,這些工作都不在我的平臺上。感謝您的幫助 – ben 2011-04-12 22:29:56
IE9的工作原理與Chrome和FF相同,IE8只支持DOM對象,IE7和更早的版本不支持getter和setter。 – Crisfole 2013-04-23 17:33:01