2015-08-01 4 views
0

То, что я пытаюсь достичь: выходДинамический наблюдаемый объект

var obj = new Dynamic({data:"something",data2:"something else"},function(val){ 
    console.log('"'+val+'"'); 
}); 

console.log(obj.data,obj.data2); 
obj.data = "this thing here"; 
console.log(obj.data,obj.data2); 

консоли

"something" "something else" 
"this thing here" 
"something" "something else" 

Мой выходной ток консоли

"something else" "something else" 
"this thing here" 
"this thing here" "this thing here" 

Мой Dynamic метод выглядит примерно так:

function Dynamic(obj,method){ 
    var ret; 
    var Update = method; 
    if(obj instanceof Object){ 
    ret = {}; 
    for(var a in obj){ 
     Object.defineProperty(ret,a,{ 
     set: function(v){ 
      inner = v; 
      Update.call(this,inner); 
     }, 
     get: function(){ 
      return inner; 
     } 
     }); 
     ret[a] = (obj[a] instanceof Array||obj[a] instanceof Object)?Dynamic(obj[a],Update):obj[a]; 
    } 
    } 
    return ret; 
} 

Проблема с этим, каждые ссылки собственности inner, а не их собственная версия внутреннего

Я попытался

Object.defineProperty(ret,a,{ 
//set: {dadedadeda} 
//get: {dadedadeda} 
value:obj[a]}); 

Но это не работает из-за this issue with get, set, and value, который является Humongous надзор в мое мнение (что, если мы хотим значение, но и хотят, чтобы перехватить вызовы?)

Я также попытался

Object.defineProperty(ret,a,{ 
//set: {dadedadeda} 
//get: {return this.inner;} 
inner:obj[a]}); 

Но мне кажется, что это то, что просто не бывает, и this относится ко всему объекту в любом случае, й

ответ

0

Как я обдумывал этот вопрос, я на самом деле нашел мой ответ: JavaScript Closures (Кто бы мог мысль)

Мой полный код выглядит примерно так

function Observable(obj, method) { 
 
    function DefineDescriptor(object, key, method, value) { 
 
    var inner = value; // this is the private value of our property 
 
    var descriptor = { 
 
     set: function(v) { 
 
     inner = (v instanceof Object) ? Observable(v, method) : v; // every object added from this point will invoke the method defined 
 
     method.call(this, key, v); 
 
     }, 
 
     get: function() { 
 
     return inner; 
 
     } 
 
    }; 
 
    Object.defineProperty(object, key, descriptor); 
 
    } 
 
    var ret; 
 
    if (obj instanceof Object) { 
 
    ret = {}; 
 
    for (var a in obj) { 
 
     DefineDescriptor(ret, a, method, (obj[a] instanceof Object) ? Observable(obj[a], method) : obj[a]); 
 
    } 
 
    } 
 
    return ret; 
 
} 
 
document.addEventListener("DOMContentLoaded", function(loadEvt) { 
 
    var B = Observable({ 
 
    key: "value", 
 
    nested: { 
 
     key: 123, 
 
     str: "hey" 
 
    } 
 
    }, function(key, val) { 
 
    console.log(this, key, this[key], val); 
 
    }); 
 
});