我想知道jQuery / javascript KVO是否有任何正常运行的库..我在网上找到的所有库(例如this一个)依赖于现已弃用的defineSetter()对象.prototype属性。
答案 0 :(得分:0)
这是一个非常古老的问题,你可能已经解决了你的问题(或围绕它解决了问题),但对后人我认为这个问题可能很有趣:https://code.google.com/p/mvcobject-js/
它不使用__defineSetter__
,而是将属性转换为其他对象。
答案 1 :(得分:0)
const MakeKeyValueObservable = obj => {
if(Object.keys(obj).length === 0) throw new Error("This design assumes that the passed in object has defined properties already.")
let observers = {}
let observable = {
observe(key, observer){
if(!observers[key]) observers[key] = []
observers[key].push(observer)
},
stopObserving(observer){
for(let key in observers){
let i = 0
const ubounds = observers[key].length;
for(i; i < ubounds; i++){
if(observers[key][i] === observer){
observers[key].splice(i, 1)
if(observers[key].length === 0) delete observers[key]
break
}
}
}
},
changed(key, old, value, me){
if(!observers[key]) return
observers[key].forEach( o => {
o.update(key, old, value, me)
})
}
}
let keys = Object.keys(obj)
let ubounds = keys.length
for(let i = 0; i < ubounds; i++){
(() => {
let prop = keys[i]
Reflect.defineProperty(observable, prop, {
get(){
return obj[prop]
},
set(v){
let old = obj[prop]
obj[prop] = v
observable.changed(prop, old, v, observable)
},
enumerable: true
})
})()
}
return observable
}
const obj = MakeKeyValueObservable({name: "test"})
const observer = {
update(key, old, value){
console.log("being notified of a change:", key, value)
}
}
obj.observe("name", observer)
obj.name = "something different"