2012-09-14 11 views
1

问题1:Mootools的以及在Win8商店应用开发

我们能否在Windows 8 Metro风格应用程序的开发中使用Mixin pattern of Mootools?换句话说,我们可以用Mootool的类覆盖/替换/扩展WinJS.Class吗?

问题2:

例如,在MooTools的,如果我们有一个基类人力:

var Human = new Class({ 
    initialize: function(name, age) { 
     this.name = name; 
     this.age = age; 
    }, 
    isAlive: true, 
    energy: 1, 
    eat: function() { 
     this.energy = this.energy + 1; //same as this.energy++ 
    } 
}); 

(使用密新)的接口类战士:

var Warrior = new Class({ 
    energy: 100, 
    kills: 0, 
    attack: function(target) { 
     target.isAlive = false; 
     this.energy = this.energy - 5; 
     this.kills++; 
    } 
}); 

导出/混凝土类忍者:

var Ninja = new Class({ 
    Extends: Human, 
    Implements: Warrior, 
    initialize: function(name, age, side) { 
     this.side = side; 
     this.parent(name, age); 
    } 
}); 



我们怎么会说这在WinJS口音使用WinJS.Class.defineWinJS.Class.deriveWinJS.Class.mix

回答

3

如果你想在你的WinJS应用程序中使用MooTools,它应该只是大部分工作。在启动时可能会有一些警告,但只要它没有违反动态生成内容的安全框架,MooTools本身就可以正常工作。我不会试图将MooTools的代码拼接到WinJS中,只是按照原样使用它。

WinJS.Class方法就像MooTools一样,定义了引擎盖下的JavaScript原型。无论您使用MooTools还是WinJS,您定义的“类型”都应该一起工作。至于你的第二个问题,我认为你可以用WinJS来完成你所需要的任何事情,但是它的语法却是不同的。

定义你的 “人” 的构造很简单:

var Human = WinJS.Class.define(
    function(name, age) { 
     this.name = name; 
     this.age = age; 
    }, 
    { 
     isAlive: true, 
     energy: 1, 
     eat: function() { 
      this.energy = this.energy + 1; 
     } 
    } 
); 

一个mixin被简单地定义为一个对象:

var Warrior = { 
    energy: 100, 
    kills: 0, 
    attack: function(target) { 
     target.isAlive = false; 
     this.energy = this.energy - 5; 
     this.kills++; 
    } 
}; 

要进行推导,你可以使用WinJS.Class.derive。这只是给你的继承部分:

var Ninja = WinJS.Class.derive(Human, 
    function(name, age, side) { 
     this.side = side; 
     Human.call(this, name, age); 
    } 
); 

然后你通过WinJS.Class.mix做混入:

WinJS.Class.mix(Ninja, Warrior); 

而且你应该是所有设置做:

var clyde = new Ninja("Clyde", "12", "confused"); 
+0

+ 1的方​​式是如何克莱德“混淆”的忍者实例化。很好的答案!在语法上,调用父类(或超类)在派生类中是有意义的。但是如果我们能够识别基类中的调用者,调用这个调用方法也是可行的。对于多态的目的,是否有可能在基类中知道调用者(在Mootools和WinJS中)?像Human :: eat功能中的alert(e.name)这样的东西。 –

+0

在早期版本的WinJS中,有一个超级属性指向你的“基类”,但是我们发现了一个令人讨厌的无限循环可能性,并且没有办法在剩下的时间内修复它。由于继承层次在JavaScript中相当罕见,我们决定删除super。对于那些需要它的人,你可以显式地调用基类的构造函数(就像我对人类的调用一样)。 –

+0

我不确定你的意思是“知道来电者”?这个引用仍然指向你的对象的状态,所以任何设置仍然可用。我不知道MooTools,因此无法评论该工具箱可能的功能。 –

相关问题