嵌套对象的setter / getters

时间:2014-08-16 18:23:22

标签: javascript javascript-objects

我知道如何设置Custom Setters&使用Object.defineProperty

在Javascript中获取

我对以下代码片段的意图是,只要修改了globalProject对象中的属性嵌套值,就能够点击setter函数。

var ClassA = function () {
    this.globalProject = {
        a: "DEFAULT VALUE",
        b: null
    };
    this.LastSavedProject = {};

};

Object.defineProperty(ClassA.prototype, 'globalProject', {
    get: function () {
        console.log("OVERRIDE");
        return this._flag;
    },
    set: function (val) {
        console.log("EDITING A DEEP VALUE")
        this._flag = val;
    },
});


var obj = new ClassA();

obj.globalProject.a = "HELLO WORLD" //Should get "EDITING A DEEP VALUE" in the console. 

我想现在发生的事情是调用getter方法并返回对我想要修改的对象的引用。因为我从未调用setter,因为我正在修改对嵌套值的引用而不是属性我有一个setter on。

任何人都可以帮我解决这个问题吗?这是一个小提琴:http://jsfiddle.net/z7paqnza/

2 个答案:

答案 0 :(得分:5)

当您执行obj.globalProject.a = "HELLO WORLD"时,您只需看到" OVERRIDE"在控制台中,因为您获得了obj.globalProject的值并设置了其数据成员a的值。

你没有看到"编辑深度价值"在控制台中,因为您从未将globalProject设置为引用其他对象,所以您只需更改其中一个基础对象的数据成员。但是,如果您执行obj.globalProject = null之类的操作,则会看到"编辑深度值"打印到控制台,因为您将更改对象obj.globalProject所指的对象。看到这个jsfiddle:http://jsfiddle.net/z7paqnza/1/

答案 1 :(得分:1)

@PaulDapolito说的是完全正确的。设置深层对象时,我们不会调用globalObject的setter。我已经更新了代码,为深层对象添加了setter,现在它调用了内部对象setter。这是jsfiddle:http://jsfiddle.net/sjLLbqLc/4/

对于这个特殊问题,我们可以在 GlobalProject 类设置器中进行插入操作。

我迟到了,但我希望这可以帮助那些在这里寻找它的人。



var ClassA = function() {
  this.globalProject = new GlobalProject(); // this sets global object
  // you can initilaize your default values here to the global object. But you need the new GlobalProject() which    will create the object with setters and getters.
};

Object.defineProperty(ClassA.prototype, 'globalProject', {
  get: function() {
    return this._flag;
  },
  set: function(val) {
    console.log("Setting global object");
    this._flag = val;
  },
});

var GlobalProject = function() {
  Object.defineProperty(GlobalProject.prototype, "a", {
    get: function() {
      return this._a;
    },
    set: function(value) {
      console.log("Seting deep object");
      this._a = value;
    }
  });
  Object.defineProperty(GlobalProject.prototype, "b", {
    get: function() {
      return this._b;
    },
    set: function(value) {
      this._b = value;
    }
  });
};


var obj = new ClassA();

obj.globalProject.a = "HELLO WORLD";// this sets the inner object