Mootools和object .__ proto__

时间:2013-11-23 05:14:13

标签: mootools

当我尝试使用属于类属性的对象时,

Object.eachObject.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的补丁。

2 个答案:

答案 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));

希望这有帮助。

相关问题