簡體   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