2010-06-24 83 views
8

如何爲原型指定默認吸氣劑? 使用默認的getter時,我的意思是調用obj.undefinedProperty123的函數。如何定義使用ECMAScript 5的默認getter和setter?

我試圖Object.prototype.get =函數(屬性){..}但這不是在這種情況下被調用。

+1

我不認爲有辦法做到,即使有任何非標準的實現,肯定不能與ECMAScript的5有一個叫'__noSuchMethod__'在Firefox方法不標準執行,並可能會在Chrome,但對於非功能屬性沒有任何相似之處。唯一的路線似乎使用了一個包裝函數,比如'get',通過它來訪問所有的屬性。 – Anurag 2010-06-24 19:19:21

+0

相關:[所有屬性的JavaScript getter](http://stackoverflow.com/q/994143/1048572) – Bergi 2014-09-29 17:08:35

回答

0

我不確定你在問什麼。但是,如果您想在用戶嘗試訪問object.nonExistingProperty時調用方法。我不認爲有什麼辦法可以做到這一點。

+0

這正是我想要做的。 我認爲這是可能的,我想我記得我之前做過 - 如果我只是知道如何... – Manuel 2010-06-24 18:47:09

2

火狐有可能與非標準noSuchMethod: -

({__noSuchMethod__:function(){alert(1);}}).a(); 
4

在ECMAScript中5,你只能截取特定的命名屬性的get/set操作通過Object.defineProperty(不是普遍的所有屬性):

Object.definedProperty(someObj, "someProp", { 
    get: function() { 
     console.log("you tried to get someObj.someProp"); 
     return "foo"; 
    } 
}); 

這裏,get功能將運行任何時間碼試圖讀取someObj.someProp

在即將到來的ECMAScript 6草案,這將通過proxies成爲可能。代理具有基礎目標對象和set/get函數。任何時候在任何代理的屬性上發生設置或獲取操作時,都會運行相應的函數,並將代理的目標對象,使用的屬性名稱和嘗試中使用的值作爲參數運行。

var proxyHandler = { 
    get: function(obj, name){ 
     console.log("you're getting property " + name); 
     return target[name]; 
    }, 
    set: function(obj, name, value) { 
     console.log("you're setting property " + name); 
     target[name] = value; 
    } 
} 

var underlyingObj = {}; 

// use prox instead of underlyingObj to use get/set interceptor functions 
var prox = new Proxy(underlyingObj, proxyHandler); 

這裏,設置在prox獲取屬性值將導致set/get功能來運行。