我想开始开发jQuery游戏,因此我需要学习jQuery OOP。我有一些(足够的)C ++ OOP经验(开发了一些游戏)。
我知道我可以用jQuery“对象”替换C ++“类”,但我不知道它是如何工作的。
jQuery还有更高级的“选项”,比如C ++吗? (抽象类/对象,不适用等......)
你能解释一下吗? (或者给我一些好的javascript OOP教程的链接)。
答案 0 :(得分:51)
JavaScript中的OOP编程可以通过多种方式完成。周围有很多模式。
我将向您展示两个,一个对象继承的实现和一个对象组合的实现。
这与jQuery完全无关。 jQuery应该用于DOM操作和事件操作。您不应该基于jQuery对象创建核心对象和构造函数。在游戏中,jQuery的角色是读取键盘输入并可选择将图形渲染到DOM中(如果由于某种原因你没有使用<canvas>
)。
<强>继承强>
var Constructor = function(name) {
this.name = name
};
Constructor.prototype.mymethod = function() {
alert("my name is : " + this.name);
};
var obj = new Constructor("foo");
obj.mymethod(); // my name is : foo
这里定义了一个Constructor
函数,您可以调用它来创建一个新对象。您可以使用this
引用构造函数内的对象。
您可以将(静态)方法和变量添加到将由对象继承的构造函数的原型中。
function inherits(child, parent) {
var f = new Function;
f.prototype = parent.prototype;
f.prototype.constructor = parent;
child.prototype = new f;
child.prototype.constructor = child;
}
您可以使用inherits
函数将构造函数的原型设置为不同构造函数的实例。这意味着该父对象的所有方法和属性都可以在子级
var SecondConstructor = function(name) {
this.name = name + "bar";
};
inherits(SecondConstructor, Constructor);
var obj = new SecondConstructor("foo");
obj.mymethod(); // my name is : foobar
这是JavaScripts的原型继承。基本上,您将函数的原型设置为特定对象。然后,当您使用该函数创建对象时,这些对象将实现原型。
<强>组合物强>
使用原型实际上并不是必需的,您也可以使用对象组合。这种方法确实需要很好地理解this
状态,您可以阅读elsewhere。
我要作弊并将一些繁琐的帮助函数委托给underscore.js
var Constructor = function(name) {
this.name = name;
this.mymethod = function() {
alert("my name is : " + this.name);
};
};
var SecondConstructor = function(name) {
var constructor = new Constructor(name + "bar");
_.bindAll(constructor);
_.extend(this, {
"mymethod": constructor.mymethod
});
};
var obj = new SecondConstructor("foo");
obj.mymethod();
这里,SecondConstructor为自己创建一个Constructor实例,而不是继承它。然后它将this
的引用绑定到该构造函数对象的所有方法,以便我们可以将对mymethod
的调用委托给我们自己的构造函数对象。这仅适用于方法,但不应该是一个问题,因为你真的不应该有公共字段。
答案 1 :(得分:3)
作为一个说明,我最近开始使用Processing.js允许声明类C ++ - 就像使用'class'一样。
稍后编辑(2014年6月):
Processing.js非常适合让项目进行而无需使用JavaScript OOP进行战斗。但是当我开始开发更大的项目时,我注意到Processing.js是一个过于抽象化的层次,实际上值得自己编写OOP位和整个代码结构。
我现在使用PIXI.js作为我的画布渲染器/交互库,并使用上面提到的一些OOP技巧以更清晰的方式构建我的代码。
答案 2 :(得分:1)
在所有编程语言中,OOP非常不相同。 C ++中的对象是类的实例,而类是完全编译时的构造。 Javascript没有类,它只有对象。
可以使用类似于类的方式使用Javascript,使用范围规则,原型链和特殊的“this”引用,但这些是强加于语言的惯用语,而不是语言的一部分。并且有许多不同的阶级式习语,以及无数自发明的习语。
在我看来,通过探索范围规则可以最好地理解javascript和C ++ / C#/ Java /等之间的关键差异。在尝试使用javascript时,代码中任何一点的变量都在范围内,特殊的“this”引用所指向的对象,何时,是理解它的关键。