【问题标题】:Javascript setters/gettersJavascript 设置器/获取器
【发布时间】:2010-03-12 14:01:05
【问题描述】:
var author = {
firstname: 'Martin',
lastname: 'Hansen'
}

function settersGetters(propStr) {
for (var i = 0; i < propStr.length; i++) {

    author['_'+ propStr[i]] = null; 

    author.__defineGetter__(propStr[i],
    function() {
        return author['_'+ propStr[i]];
    });

    author.__defineSetter__(propStr[i],
    function(val) {
        author['_'+ propStr[i]] = val;
    });
};
}

上述代码有望为对象作者的任何提供的属性(在数组中)生成 setter/getter。

但是当我调用下面的代码时,名字和姓氏都是 olsen.. 我做错了什么?

settersGetters(['firstname', 'lastname']);
author.firstname = 'per';
author.lastname = 'olsen';

console.log(author.firstname);
console.log(author.lastname);

【问题讨论】:

    标签: javascript setter getter


    【解决方案1】:

    我怀疑这是一个关闭问题,几个有帮助的人向我解释了 here

    尝试将i 引用包装在一个函数中,并阅读闭包。尽管得到了所有帮助,但我承认我仍然没有真正理解它们。

    【讨论】:

    【解决方案2】:

    定义是在闭包中进行的,所以所有的 setter 都使用 i 的最后一个值。

    改用这个:

    function setterGetter(property)
    {
        author['_'+ property] = null; 
    
         author.__defineGetter__(property,
        function() {
            return author['_'+ property];
        });
    
        author.__defineSetter__(property,
        function(val) {
            author['_'+ property] = val;
        });
    }
    function settersGetters(propStr) {
    for (var i = 0; i < propStr.length; i++) {
            setterGetter(propStr[i]);
    };
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-24
      • 2013-02-07
      • 1970-01-01
      相关资源
      最近更新 更多