我知道如何设置Custom Setters&使用Object.defineProperty
我对以下代码片段的意图是,只要修改了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/
答案 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