2014-09-23 48 views
0

我需要這樣做,以便每當我的對象上的特定屬性發生更改時 - 它將調用同一對象上的特殊方法。對象創建定義屬性設置器

例子:

MyObject.prototype = Object.create({ 
    specialMethod: function() { /* ... */ } 
    }, { 
    someValue: { 
     set: function(value) { 

     /* HOW DO I ASSIGN THE VALUE TO MyObject HERE?*/ 
     /* I can't do: this.someValue=value, that would create endless recursion */ 

     this.specialMethod(); 
     } 
    } 
    }); 

如何分配給屬性的setter內MYOBJECT價值?

+0

指定'MyObject'會毀掉所有這些。理論上你可以做'MyObject = value',但正如我所說的那樣,它破壞了原型。 – Scimonster 2014-09-23 14:58:10

+0

爲什麼要覆蓋'MyObject'? – Bergi 2014-09-23 14:58:22

+2

我假設你只是想分配一個當前'MyObject'實例的屬性?只要一如既往地使用'this'。 – Bergi 2014-09-23 14:59:03

回答

4

getter/setter屬性中沒有存儲位置,您無法在其上存儲值。你需要將它存儲在其他地方,併爲此創建一個getter。有兩種解決方案:

  1. 使用第二個, 「隱藏」 屬性:

    MyObject.prototype.specialMethod: function() { /* ... */ }; 
    Object.defineProperty(MyObject.prototype, "someValue", { 
        set: function(value) { 
         this._someValue = value; 
         this.specialMethod(); 
        }, 
        get: function() { 
         return this._someValue; 
        } 
    }); 
    
  2. 使用閉包變量(通常在建設 實例的創建):

    function MyObject() { 
        var value; 
        Object.defineProperty(this, "someValue", { 
         set: function(v) { 
          value = v; 
          this.specialMethod(); 
         }, 
         get: function() { 
          return value; 
         } 
        }); 
    } 
    MyObject.prototype.specialMethod: function() { /* ... */ }; 
    
+0

謝謝!對於最初例子的混淆感到抱歉。這正是我所需要的(決定去關閉這個對象不會被'隱藏'屬性散佈) – YemSalat 2014-09-23 15:12:41

相關問題