這是因爲您使用的立即調用函數
for(var i in properties){
(function(){ //<--- This
this["get"+i] = function() { return properties[i];};
this["set"+i] = function (valueOne) { properties[i] = valueOne; };
})();
}
刪除它,它仍然無法正常工作,但你的方法將在那裏。爲了得到它完全工作,你應該保留i
for(var i in properties){
(function(i){ //<--- This
this["get"+i] = function() { return properties[i];};
this["set"+i] = function (valueOne) { properties[i] = valueOne; };
}) (i); //<--- and this
}
後一個問題沒那麼感興趣(雖然相關)的第一個。
JavaScript只有所謂的「功能範圍」,這意味着限制功能範圍的唯一事情是...好...功能。因此,常見的模式是在循環內部或在許多不希望變量泄漏的地方使用IIFE。
但是,javascript中的this
參數很奇怪。瞭解以下內容,它將爲您節省一大筆麻煩:this
javascript中與其他任何參數沒有區別。
讓我解釋一下。
有四種方法可以在javascript中調用函數。
myFn.call("this param", "param 1", "param 2"); //this is "this param"
myFn.apply("this param", ["param 1", "param 2"]); //this is "this param"
myFn("param 1", "param 2");
//javascript takes a guess at what `this` should be -
//usually it is set to the global `window`.
new myFn("param 1", "param 2");
//`this` is a new function with its' prototype set to myFn.prototype
如果你總是使用.call
形式的所有不確定性就會消失,你可以看到,this
正是像其他參數。然而,這是額外的語法,人們更喜歡使用更簡單的形式,這意味着你必須考慮什麼是「這個」的規則。
因此,在您的示例中,您正在對全局window
對象放置getter和setter。
我要做一個聲明在這裏,你的書可能不會,但我已經從多年的學習撈起,用工作和教學的JavaScript同意:
不要使用new
和this
關鍵字。
這兩個關鍵字將大量的概念引入到JS中,這些概念令人困惑,而且確實如此 - 除非你讓性能非常敏感(你不是,我知道你認爲你是,但你不是) - 不必要。相反,創建新的對象僅僅是這樣的:
var user = { name: "Billy", age: 35 };
如果你絕對必須有 getter和setter方法,這將做到這一點:
function createObjectWithProps (properties){
var obj = {};
var state = {}[
for(var k in properties){
(function(key) {
obj["get"+key] = function() { return state[key];};
obj["set"+key] = function (valueOne) { state[key] = valueOne; };
})(k)
}
return obj;
}
var userOne = createObjectWithProps ({ name: "Billy", age: 35 });
userOne.getname();
雖然我會更進一步地指出,getter和setter在js中並不是非常有用,當你使用它們時,遵循類似於knockout的模式是標準的。
也許他們在後面解釋什麼是錯誤的,以及需要改變什麼。 – rid