2011-05-04 58 views
4

Object.keys()考慮這個簡單Mootools的類:Mootools的類 - 對對象屬性

var Garden = new Class({ 
    fruits : { 
     banana : 'yellow', 
     kiwi : 'brown', 
     strawberry : 'red' 
    }, 
    initialize : function() { 
     console.log(this.fruits); 
     console.log(this.fruits.banana); 
     console.log(Object.keys(this.fruits)); 
    } 
}); 
var g = new Garden; 

輸出(在Chrome控制檯):

reset.F 
yellow 
[] 

第三行應爲:['香蕉','kiwi','strawberry'] 該問題位於Mootools重置方法中,該方法以原始水果對象爲原型創建一個新對象。由於Object.keys迭代檢查hasOwnProperty,它將返回一個空數組。

有關如何獲得預期輸出的任何想法?

回答

5

這將讓你的預期輸出:

var Garden = new Class({ 
    fruits : { 
     banana : 'yellow', 
     kiwi : 'brown', 
     strawberry : 'red' 
    }, 
    initialize : function() { 
     console.log(this.fruits); 
     console.log(this.fruits.banana); 
     var foo = Object.clone(this.fruits); 
     console.log(Object.keys(foo)); 
    } 
}); 
var g = new Garden(); 

不過 - ,爲什麼它的發生 - 因爲水果繼承性只有當你複製它,它克隆繼承屬性給新的對象,以取消引用他們

+0

你也可以將對象包裝在一個數組中,例如。水果:[{無論}],它會工作。這對我來說似乎是一個在mootools中的錯誤。我正在使用Mootools 1.4.5 – hobberwickey 2012-04-17 12:58:47

+0

它在mootools中的錯誤如何?這是簡單的對象繼承原型鏈。 'optionsObj = {foo:「bar」}','constructorObj:{options:optionsObj}' - 通過取消引用傳遞給原型。但從原型到實例都是通過引用來實例繼承的選項對象。 'instance.options == constructor.prototype.options' so:'constructor.prototype.options.foo =「foo」;' - >'instance.options.foo ===「foo」;'因爲它在原型鏈上。請參閱http://jsfiddle.net/d4VLw/ – 2012-04-17 13:46:00

+0

以進一步說明 - 請參閱何時使用合併選項對象的setOptions:http://jsfiddle.net/d4VLw/1/,並在此之前,對象鍵返回空:http://jsfiddle.net/d4VLw/2/ – 2012-04-17 14:03:56