javascript - 将 getter 和 setter 与 Object.defineProperty 一起使用

标签 javascript ecmascript-5

我想使用 Object.defineProperty() 将数据属性转换为访问器属性。考虑一下导致 Uncaught RangeError: Maximum call stack size returned 错误的代码

var c = { name: 'abcde'};
Object.defineProperty(c, 'name', {
    get: function() {
        return this.name; //causes stack overflow
    },
    set: function(x) {
       this.name = x; //causes stack overflow
        }
}); 
c.name="xyz";  
console.log(c.name);

我明白为什么会出现错误。 建议的解决方案之一是从 getter 和 setter 中删除“this”,它似乎有效。

var c = { name: 'abcde'};
Object.defineProperty(c, 'name', {
    get: function() {
        return name; //removed this
    },
    set: function(x) {
       name = x; //removed this
        }
}); 
c.name="xyz";  
console.log(c.name);

发生什么事了?一般来说,我想问如何使用 Object.defineProperty() 将数据属性转换为访问器属性?

最佳答案

第二个代码实际上不起作用,因为它使用名为name全局变量来存储值,而不是将其存储在对象c

如果不是因为 window.name 是浏览器中全局对象的默认属性,它会被 ES5“严格模式”拒绝。

更合适的解决方法是将值存储在词法范围的私有(private)变量中:

var c = (function() {
    var obj = {};
    var name = "abcde";

    Object.defineProperty(obj, "name", {
        get: function() {
            return name;
        },
        set: function(x) {
            name = x;
        }
    });

    return obj;
})();

关于javascript - 将 getter 和 setter 与 Object.defineProperty 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41803778/

相关文章:

javascript - Array.every 返回 false 而不是类型错误

javascript Riddle : 2 objects that seem identical with respect to constructor, 原型(prototype)和 __proto__ 链接,行为不同

javascript - ECMAScript 关联数组到对象/原型(prototype)为空?

javascript - Teechart HTML5,线条颜色和粗细

javascript - 使用 JavaScript 隐藏软键盘后确定正确的 Android WebView 屏幕大小?

javascript - 为什么没有在 ns-popover 弹出窗口中选择 radio 。仅在表格最后一列弹出窗口中选择单选

javascript - 在 addEvent() 传奇之后,当前的最佳实践是什么?

javascript - 当同一 HTML 文档中存在多个 <form> 标记时,验证失败

javascript - 如何在不使用 JS 按下任何键的情况下检测 CAPS LOCK STATUS 是否处于事件状态?

ecmascript-5 - ES5相对于ES3的优势