小编3y3*_*3y3的帖子

Object.defineProperty 获取/设置闭包

好的,我尝试这样创建新对象:

var src = {a:'a', b:'b', c:'c'};
var out = {};
for(var prop in src){   
    Object.defineProperty(out, prop,{
        get: function(){
            return src[prop];
        },
        set: function(val){
            src[prop]=val;
        }
    })
}
Run Code Online (Sandbox Code Playgroud)

并得到一个糟糕的结果:

out = {a:'c', b:'c', c:'c'}
Run Code Online (Sandbox Code Playgroud)

我知道创建这个对象的其他方法,例如:

for (var prop in src) {
    (function(prop) {
        Object.defineProperty(out, prop, {
            get: function() {
                return src[prop];
            },
            set: function(val) {
                src[prop] = val;
            }
        })
    })(prop)
}
Run Code Online (Sandbox Code Playgroud)

或者:

Object.keys(src).map(function(prop){
    Object.defineProperty(out, prop,{
        get: function(){
            return src[prop];
        },
        set: function(val){
            src[prop]=val;
        }
    })
})
Run Code Online (Sandbox Code Playgroud)

但我不明白为什么在第一种方法中,字符串参数“prop”将通过链接发送到函数“defineProperty”。请帮助我理解这一点。抱歉英语不好。

javascript get object set

5
推荐指数
1
解决办法
1960
查看次数

是否可以更容易地组合这些功能?

我需要结合一些函数(修改第一个函数),但我不能这样做(它有效,但对我不好):

var a = function(){alert('a');};
var b = function(){alert('b');};
var c = a;
a = function(){c(); b();};
a();
Run Code Online (Sandbox Code Playgroud)

然后我尝试这样做:

var a = function(){alert('a');};
var b = function(){alert('b');};
var rx = /^[\s\S]*\(([\s\S]*)\)\s*{([\s\S]*)}$/;
concat = function(f1,f2)
    {
        var q = f1.toString().replace(rx,'$1|$2').split('|');
        var w = f2.toString().replace(rx,'$1|$2').split('|');
        return (q[0]!=='' && w[0]!=='')?
            new Function(q[0]+','+w[0],q[1]+w[1]):
            (q[0]!=='')?
                new Function(q[0],q[1]+w[1]):
                new Function(w[0],q[1]+w[1]);
    };
a = concat(a,b);
alert(a);
Run Code Online (Sandbox Code Playgroud)

它有效,但可能存在更简单的方法吗?

javascript

0
推荐指数
1
解决办法
68
查看次数

标签 统计

javascript ×2

get ×1

object ×1

set ×1