var Widget = new Class({
Implements: Options,
options: {
color: '#fff',
size: {
width: 100,
height: 100
}
},
initialize: function(options){
this.setOptions(options);
}
});
var myWidget = new Widget({
color: '#f00',
size: {
width: 200
}
});
//myWidget.options is now: {color: #f00, size: {width: 200, height: 100}}
// Deep copy example
var mySize = {
width: 50,
height: 50
};
var myWidget = new Widget({
size: mySize
});
(mySize == myWidget.options.size) // false! mySize was copied in the setOptions call.
来自here
myWidget.options.size也应该是
{
width: 50,
height: 50
};
为什么(mySize == myWidget.options.size)// false! ?
答案 0 :(得分:2)
不明显,但您从示例中复制的注释会告诉您原因。
// false! mySize was copied in the setOptions call.
对象的等于是实例。 setOptions复制mySize。它在初始化时运行。
initialize: function(options){
this.setOptions(options);
}
除非你提出一个我错过的更复杂的问题。
答案 1 :(得分:1)
这样的东西不起作用,因为它不会检查对象的值,而是检查对象的身份:
({width:1, height:1}) == ({width:1, height:1})
因此,如果你想比较两个对象,你必须写出类似的东西
obj1.width == obj2.width && obj1.height == obj2.height;
答案 2 :(得分:0)
比较2个对象是没有意义的,如@styrr所述,但你可以比较对象的序列化表示:
console.log(JSON.encode(mySize) === JSON.encode(myWidget.options.size)); // true
虽然你最好比较个别价值,但它更便宜。
另外,请查看Object.clone()
取消引用。默认情况下,对象通过引用传递,但在选项的情况下,它们被解除引用。 I.E.如果您更改mySize.width
,则不会更改instance.options.size.width
,这是您可以正常获得的。
答案 3 :(得分:0)
使用underscorejs.js isEqual来比较JSON对象http://underscorejs.org/#isEqual