0

(例は本からのものですが、私はそれを理解していないようです)

    function User (properties){
       for( var i in properties){
           (function(){
               this["get"+i] = function () { return properties[i];};
               this["set"+i] = function (valueOne) { properties[i] = valueOne; }; 
           }) ();
        }// END for
    }// END User

var userOne = new User ({ name: "Billy", age: 35 });
userOne.getname(); 

これを実行すると、ユーザーにはメソッドがありませんgetname。特権メソッドを機能させるにはどうすればよいですか?

4

4 に答える 4

3

両方が必要であり、クロージャーthisにキャプチャされています。i

function User (properties){
   for( var i in properties){
       (function(t, i){
           t["get"+i] = function () { return properties[i];};
           t["set"+i] = function (valueOne) { properties[i] = valueOne; }; 
       }) (this, i);
    }// END for
}// END User
于 2014-01-22T16:30:43.333 に答える
2

thisあなたが思っている人ではありません。何もない状態で IIFE を呼び出したthisため、グローバル スコープになるため、ウィンドウはメソッドgetnameなどを取得しますが、これは期待したものではありません。

これを修正するには、IIFE を保持したい場合は、適切なコンテキストで呼び出す必要があります。

function User (properties){
       for( var i in properties){
           (function(key){
               this["get"+key] = function () { return properties[key];};
               this["set"+key] = function (valueOne) { properties[key] = valueOne; }; 
           }).call(this, i);
        }// END for
    }// END User

var userOne = new User ({ name: "Billy", age: 35 });
userOne.getname(); 

i引数を関数に渡し、それをパラメーターとして解釈することも忘れていることに注意してください。そうしないと、すべての関数が同じキーにバインドされ、userOne.getname35 が返されます。

于 2014-01-22T16:30:54.017 に答える
-1

問題は「this」キーワードです。

すぐに呼び出される関数内で使用しているため、グローバルスコープを指しています。

これを試して:

function User (properties){

   for( var i in properties){
       (function(self,i){
           self["get"+i] = function () { return properties[i];};
           self["set"+i] = function (valueOne) { properties[i] = valueOne; }; 
       }) (this,i);
    }// END for
}// END User
于 2014-01-22T16:29:33.293 に答える