2013-10-17 93 views
0

我來自Ruby背景,並且試圖測試與對象交互的Javascript庫檢索了JSON api的終點。任意嘲弄對象屬性

我該如何在Javascript中重新創建以下Ruby?

class ArbitraryMock 
    def initialize(property_hash) 
    @property_hash = property_hash 
    end 

    def method_missing(*args) 
    @property_hash[args.first] || '' 
    end 
end 

編輯:method_missing是一種動態方法,只要方法不存在就會被調用。這個方法的默認版本引發了一個NoMethodError(Javascript會返回undefined我相信)。通過重寫的方式方法,如上述,它可以讓你不喜歡的東西如下:

some_object = ArbitraryMock.new(foo: 'bar') 

some_object.foo 
=> 'bar' 
some_object.bang 
=> '' 
+0

method_missing做什麼?在這種情況下,它是用來返回屬性的值還是空字符串?如果這是正確的,你可以用getter/setter做些事情。 – Andy

+0

請參閱我的問題的編輯版本。 – HaaR

+0

我已經更新了我的答案。我希望這有些用處。 – Andy

回答

0

由於Javascript doesn't have an equivalent to method missing,我能想到這樣做的唯一途徑,這是用getter和setter方法。

初始化參數。每個屬性都有一個getter和setter。 getter返回一個私有變量或一個空字符串的值; setter使用它分配的值來設置私有變量。

​​

設置任意模擬對象並初始化。初始化方法將getter和setters引向對象。

var arbitraryMock = { 
    initialise: function (params) { 
     for (var k in params) { 
      this[k] = params[k]; 
     } 
    } 
}; 

arbitraryMock.initialise(params); 

測試名稱的值,最初返回一個空字符串。

console.log(arbitraryMock.name); // empty string 

但是,如果你把值賦給name

arbitraryMock.name = 'Basil Fawlty'; 
console.log(arbitraryMock.name); // 'Basil Fawlty' 

這適用於您添加到該對象的其他屬性。

console.log(arbitraryMock.dog); // empty string 
arbitraryMock.dog = 'Terrier'; 
console.log(arbitraryMock.dog); // 'Terrier' 

Fiddle

希望這會有所幫助。

+0

對不起,我應該解釋ruby代碼 - method_missing是一個動態方法,當您嘗試在未定義的對象上調用某個方法時會調用該方法。 – HaaR