我還沒有實際使用的淘汰賽,但一個相當不錯的猜測是,該模型的屬性是否訪問函數委託給被包裝的對象(和做更多的東西,像改變通知)。下面是一些代碼,具有相同的行爲:
var obj = { a: 1, b : 2 };
var ko = Object.create(null, {
_obj : { value : obj, enumerable: false },
a : {
get : function() { return this._obj.a },
set : function(v) { this._obj.a = v; console.log('Dispatch change event!') }
},
b : {
get : function() { return this._obj.b },
set : function(v) { this._obj.b = v; console.log('Dispatch change event!') }
}
});
ko.b = 3;
console.log(ko.a, ko.b);
console.log(JSON.stringify(ko));
是的,JSON.stringify
沒有考慮到功能(按JSON spec)和非枚舉的屬性。兩者都可以在上面的例子中看到。
按haim770的評論,它更直截了當,因爲屬性本身的功能,這是簡單地通過JSON.stringify方法忽略:
var ko = {
a : function(v) {
if (!arguments.length) return obj.a;
else { obj.a = v; console.log('Dispatch change event!') }
},
b : function(v) {
if (!arguments.length) return obj.b;
else { obj.b = v; console.log('Dispatch change event!') }
},
}
你可以做到這一點與.prototype,Object.defineProperty (),或者使用函數作爲子對象。 – dandavis
@dandavis感謝'defineProperty'!我真的不知道函數沒有顯示在'JSON.stringify()' –
Knockout並不試圖「隱藏」任何東西,它只是'observable'函數使用的副作用。 – haim770