繁体   English   中英

如何使用JavaScript中的defineProperty制作动态吸气剂?

[英]How to make dynamic getter with defineProperty in JavaScript?

我想在JavaScript中使用defineProperty定义动态的getter函数,如下所示。 为了制作一个只读函数,我想使用defineProperty 这使我可以在setter函数中引发异常。

但是,getter函数将不起作用。 我认为此getter会动态返回obj的所有属性。 但事实并非如此。 它总是返回obj["three"] (最后一个属性)。 是否有任何方法可以使动态吸气剂在JavaScript中返回适当的属性?

var obj = {"one":1, "two":2, "three":3};
var cloned = {};

for (var prop in obj) 
{
    var getter = makeGetter(prop);
    Object.defineProperty(cloned, prop, 
    {
        set: function() 
        {
            throw new UnableRewriteException('original cannot be rewrite');
        },
        get: function() 
        {
            return obj[prop]
        },
        enumerable: true
    });
}

正如@ paul-s所提到的,您在循环内部存在闭包问题。 一个简单的解决方法:

var obj = {"one":1, "two":2, "three":3};
var cloned = {};

function makeReadOnlyProperty(cloned, obj, prop) {
    Object.defineProperty(cloned, prop, 
    {
        set: function() 
        {
            throw new UnableRewriteException('original cannot be rewrite');
        },
        get: function() 
        {
            return obj[prop]
        },
        enumerable: true
    });
}

for (var prop in obj) 
{
    makeReadOnlyProperty(cloned, obj, prop);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM