0

Json ファイルに基づくオブジェクトのゲッター関数とセッター関数を作成したいと考えています。John Resig の本 (Apppress Pro JavaScript Techniques) の以下のコードをコピーしましたが、機能せず、これらの関数がオブジェクトに追加されません。理由と正しいコードを教えてください。

// Create a new user object that accepts an object of properties
function User(properties) {
// Iterate through the properties of the object, and make sure
// that it's properly scoped (as discussed previously)
  for (var i in properties) {
    (function () {
        // Create a new getter for the property
        this["get" + i] = function () {
            return properties[i];
        };

        // Create a new setter for the property
        this["set" + i] = function (val) {
            properties[i] = val;
        };
    })();
  }
}

// Create a new user object instance and pass in an object of
// properties to seed it with
var user = new User({
name: "Bob",
age: 44
});

// Just note that the name property does not exist, as it's private
// within the properties object
//alert( user.name == null );

// However, we're able to access its value using the new getname()
// method, that was dynamically generated
alert(user.getname());
4

2 に答える 2

3

関数を使用してクロージャーを作成しましたが、関数に渡すのを忘れましiた。コンテキストが に変わるため、関数this内への別の参照も必要になります。window

function User(properties) {
    var i, me = this;
    for (i in properties) (function (i) {
        // Create a new getter for the property
        me["get" + i] = function () { // using `me` because `this !== me`
            return properties[i];
        };

        // Create a new setter for the property
        me["set" + i] = function (val) {
            properties[i] = val;
        };
    }(i)); // i passed into function closure
}
于 2013-08-12T09:57:51.507 に答える
2

あなたの IIFE では、this実際にはwindowです。次を使用してコンテキストを指定する必要がありますFunction.prototype.call

function User(properties) {
    // Iterate through the properties of the object, and make sure
    // that it's properly scoped (as discussed previously)
    for (var i in properties) {
        (function(i) {
            // Create a new getter for the property
            this["get" + i] = function() {
                return properties[i];
            };

            // Create a new setter for the property
            this["set" + i] = function(val) {
                properties[i] = val;
            };
        }).call(this, i);
    }
}

または、別の変数を使用して参照を保持します。

function User(properties) {
    var that = this;

    // Iterate through the properties of the object, and make sure
    // that it's properly scoped (as discussed previously)
    for (var i in properties) {
        (function(i) {
            // Create a new getter for the property
            that["get" + i] = function() {
                return properties[i];
            };

            // Create a new setter for the property
            that["set" + i] = function(val) {
                properties[i] = val;
            };
        })(i);
    }
}

厳密モードの場合、コードは誤解を招くように成功するのではなく、エラーをスローします。

TypeError: Cannot set property 'getname' of undefined
于 2013-08-12T09:59:11.687 に答える