Javascript 定义属性

标签 javascript getter-setter

使用时:

Object.defineProperty(obj,prop,desc){
    get: function(){...
    set: function(){...
}

无论指定什么属性,getter/setter 是否适用于 obj[prop] 还是作用于 obj

我问这个问题是因为我正在尝试基于嵌套对象设置一些数据绑定(bind),例如:

obj[propA] = {propB:'seomthing',propC:'somethingElse'}

当我做这样的事情时:

var obj = {value:{propA:'testA',propB:'testB'}};

Object.defineProperty(obj.value,'propA',{
    get: function(){return this.value;},
    set: function(newValue){this.value=newValue;console.log('propA: ',newValue);}
});

console.log(obj.value.propA);

obj.value.propA = 'testA';

Object.defineProperty(obj.value,'propB',{
    get: function(){return this.value;},
    set: function(newValue){this.value=newValue;console.log('propB: ',newValue);}
});

console.log(obj.value.propB);

obj.value.propB = 'testB';

console.log('propA: ',obj.value.propA,' --propB: ',obj.value.propB);

getter 将值分配给对象内 defineProperty 设置的所有属性。

如果这是正确的功能,是否有办法让 getter/setter 仅对定义的属性起作用,以便在上面的 fiddle 中,propA 将产生 testA,propB 将产生 testB?

最佳答案

getter 和 setter 仅适用于指定属性,但每个属性中的 this 均引用其属性所属的对象(您不必为每个属性都提供支持变量)。

在您的示例中,您始终在读取和修改 obj.value.value。您可以通过将每个变量包装在 IIFE 中来为每个变量创建不同的变量,例如:

(function () {
    var value;

    Object.defineProperty(obj.value, 'propA', {
        get: function () { return value; },
        set: function (newValue) { value = newValue; },
    });
})();

Updated fiddle

关于Javascript 定义属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31632952/

相关文章:

javascript - 引用 foreach 循环中的全局 jquery 函数变量

java - 如何从子类的子类获取在父类(super class)中实例化的对象的字段

c# - 为什么允许我修改对象初始值设定项只读的属性?

javascript - 是否有所有属性的 Object.watch/__noSuchMethod__ 可用的垫片?

javascript - 如何重新分配对象 "getter"方法?

java - 使用java反射覆盖复杂对象实例中的值

javascript - Kendo UI Observable Array 子项被 Kendo UI treeView 破坏

javascript - KnockoutJS foreach 绑定(bind) : cannot apply bindings multiple times to same element

javascript - JS 数据过滤器和组不正确

javascript - 仅使用 javascript 在 div 中加载另一个 html 文件时更改 url