Object.each
,Object.keys
,...无法正常工作,请检查this example:
var map = {a: 1, b: []}; // simple object
var SomeClass = new Class({'map': map}); // class attribute
var sc = new SomeClass();
使用简单的对象,一切正常
console.log(map.hasOwnProperty('a')); // true
console.log(map.hasOwnProperty('b')); // true
console.log(Object.keys(map)); // ['a', 'b']
但是使用sc.map时,不能使用标量值(int,boolean,string)
console.log(sc.map.hasOwnProperty('a')); // expected: true, returns: false
console.log(sc.map.hasOwnProperty('b')); // expected: true, returns: true
console.log(Object.keys(sc.map)); // expected: ['a', 'b'], returns: [b]
我意识到这是因为sc.map有一个__proto__
属性
console.log(map.__proto__); // expected: empty Object
console.log(sc.map.__proto__); // expected: the "map" Object
我认为这是最近的问题,因为我有大量的代码,有些东西因此而停止工作。我不想更改我的所有代码来解决这个问题,我猜想需要一些针对mootools的补丁。
答案 0 :(得分:4)
哇。所以源代码https://github.com/mootools/mootools-core/blob/master/Source/Class/Class.js#L85,合并很多:https://github.com/mootools/mootools-core/blob/master/Source/Core/Core.js#L348-L369
想要derefrence。优秀。
var map = {a: 1, b: []}; // simple object
var SomeClass = new Class({'map': map}); // class attribute
var sc = new SomeClass();
console.log(sc.map.b.length);
map.b.push('doge');
console.log(sc.map.b.length); // 0
console.log(map.b.length); // 1
map.a = 'doge';
console.log(sc.map.a); // 1
严肃地说,根本不是最近的变化,任何非原始人都在copied
,不要惊慌。这是件好事。你可能不希望你的对象的原型因为它引用的东西而改变。
现在。话虽如此,但最终结束时却很奇怪。 http://jsfiddle.net/mMURe/2/ - 我同意这并不理想,而且有些出乎意料。在GH上提出一个问题,虽然不要屏住呼吸。如果这是最近的更改,它将与浏览器更改有关。 1.3.2中的代码中断相同,而mootools 1.4.5现在已经很老了,并且没有变化。我代表你提交的问题在这里:https://github.com/mootools/mootools-core/issues/2544 - 随意详细说明并添加更多有用的地方(我仍然不喜欢将对象传递给原型)
但是如果你需要通过引用让你的对象拥有map对象并避免合并,你可以将引用放在构造函数方法中:
var map = {a:1},
foo = new Class({
initialize: function(){
this.map = map;
}
});
var bar = new foo();
map.a++;
console.log(bar.map.a); // 2
但如果你绝对必须打破常规并知道副作用,那么你可以。
var map = {a: 1, b: []}; // simple object
var SomeClass = new Class(); // class attribute
// avoid the derefrence rush, go prototypal manually
SomeClass.prototype.map = map;
var instance = new SomeClass,
other = new SomeClass;
console.log(instance.map.a); // 1
map.a++;
console.log(instance.map.a); // 2
// but also:
console.log(other.map.a); // 2
请记住,MooTools类只是构造函数创建的糖,可以避免不必重复和非简洁的操作。它仍然是引擎盖下的javascript,你可以在顶部使用经典的原型模式。
答案 1 :(得分:1)
我刚刚遇到这个问题。为了避免它,我使用了Object.clone()
。 Object.clone()
返回一个普通对象而不是一个类对象,因此它没有__proto__
属性,一切都运行正常。在上面给出的示例中,我会这样做:
var scMap = Object.clone(sc.map);
console.log(scMap.hasOwnProperty('a'));
console.log(scMap.hasOwnProperty('b'));
console.log(Object.keys(scMap));
希望这有帮助。