Это потому, что вы использовали сразу же вызывается функция
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, подобных этому внутри циклов for или во многих местах, где вы не хотите, чтобы переменные протекали.
Однако параметр this
в javascript странный. Поймите следующее, и это сэкономит вам тонна из хлопот: 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
.
Я собираюсь сделать заявление здесь, что ваша книга, вероятно, не согласен с, но что я взял от года обучения, работать, и обучение JavaScript:
Не используйте new
и this
ключевые слова.
Эти два ключевых слова вводят тонну понятий в JS, которые сбивают с толку и действительно - если вы что-то не делаете очень чувствительность к производительности (вы не знаете, что вы думаете, что вы есть, но это не так) - не обязательно.Вместо того, чтобы создавать новые объекты просто так:
var user = { name: "Billy", age: 35 };
если вы абсолютно должны иметь добытчиками и сеттеров это сделать:
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();
Хотя я пойду еще дальше утверждать, что методы получения и установки не очень полезны в js, и когда вы их используете, стандартно следовать шаблону, аналогичному тому, что делает knockout.
Возможно, позже они объяснят, что в этом плохого и что нужно изменить. – rid