海蘭我寫的JS和HTML一個快速和骯髒的列表的用戶界面,可以過濾: https://jsfiddle.net/maxbit89/2jab4fa4/找到了JavaScript Setter錯誤?
所以這種用法是這樣的(小提琴行:96):
var list = new ui_list(document.body, 200, 300, "Test");
var encoder = function(dom, value) {
console.log("begin encoding");
console.log(value)
dom.innerHTML = value.n;
}
list.add({'n': 1}, function() {
this.value.n++;
console.log(this.value.n);
// this.value = this.value;
}, encoder);
那麼什麼這basicaly確實是創建列表,並增加了一個元素它具有一個對象:{「n」個:1}作爲值和onClickHandler(上list.add第二參數)至極應由1(小提琴線增加值: 104)
但它不會做到這一點,直到您取消註釋在撥弄線106。 (使用FireFox 50.1.0和Edge瀏覽器進行測試)
有沒有任何機構知道爲什麼js的行爲如此呢? 在一個多simplier例如,這工作得很好:
var myObj= {
'onvalueChange' : function() {
console.log('value changed');
},
'print' : function() {
console.log('value:');
console.log(this.value);
console.log(this.value.n);
}
};
Object.defineProperty(myObj, "value", {
get: function() { return this._value; },
set: function(value) {
this.onvalueChange();
this._value = value;
}
});
myObj.value = {'n' : 1};
myObj.value.n++;
myObj.print();
你只能「看」屬性一層深;更改爲子屬性不使用的setter /吸氣 – dandavis