我还在学习jQuery,但是我越是使用jQuery,它就越是程序化而不是面向对象。例如,我不认为我已经看过或使用过任何jQuery类,虽然我确信在内部使用了一些。我所做的只是方法链接,而不是自己构建对象。例如新的Foo()。此外,jQuery documentation for plug-in development甚至没有提及类。
我的观察是否正确jQuery鼓励您只公开函数和方法,并在编写基于jQuery的库时保留任何自定义类内部?我不是在讨论编写jQuery插件,而是讨论每个应用程序独有的自定义库。
我来自Java,所以我在这里很困惑。
答案 0 :(得分:5)
jQuery比程序更多OO。
$(domNode)
返回一个新的jQuery对象。如果你看一下源代码,jQuery方法会返回一个new
对象。
$(domNode).foo
在jQuery对象上调用该方法。
您对没有class
关键字的事实感到困惑。
function Constructor() {
this.constructed = true;
}
var o = new Constructor;
alert(o.constructed);
只要使用new
关键字,该函数将用作对象构造函数。 Java和JavaScript OO之间存在很大差异。 JavaScript使用原型继承而不是基于类的继承。
jQuery中的链接如图所示here完成。在jQuery对象上调用的每个方法都将返回jQuery对象。
$(obj).css("foo").attr("bar"); // we can call both methods on $(obj)
var o = $(obj).css("foo"); // .css returns $(obj)
alert(o[0] === $(obj)[0]); // o & $(obj) point to the same DOM node
o.attr("bar");
答案 1 :(得分:5)
jQuery主要只是一个基于DOM API的层,加上一些方便的方法,如each()
,用于迭代和枚举。它平滑了一些人可能认为是DOM API中的笨拙,而且肯定是各个实现之间缺乏一致性。
它不是一个框架,它不是一种语言。它实际上只是提供了比DOM API提供的更好的体验。
它利用了javascript中的OOP功能,但它本身并没有提供特定的编程范例。还有其他图书馆,例如prototypejs
和underscore
,更专注于该领域。
答案 2 :(得分:2)
如果文档没有提及类或类似的东西,因为jQuery绝对不是一种语言。它是用Javascript编写的API,Javascript是Prototype programing language。
答案 3 :(得分:1)
这不是jQuery困扰你,它是JavaScript :) JavaScript是基于原型的语言,OO风格有点不同。它实际上是通过原型模拟OO(更多信息,你可以在这里阅读 - http://en.wikipedia.org/wiki/JavaScript#Prototype-based)
jQuery与OO有很大关系。
$
函数实际上是一个用于创建jQuery对象的工厂方法 - 这就是为什么你不写自己new Foo()
以$开头的东西。更像是实用方法。 例如(来自维基百科)jQuery中的映射函数:
$.each([1,2,3], function(){
document.write(this + 1);
});
答案 4 :(得分:1)
JQuery确实是OO。也许你没有看到类,因为JavaScript中的类看起来有点不同。它们实际上是一些额外的功能:
// Yes, this function is actually a class constructor.
function Demo(a)
{
// A property is declared easily and can be unset as well.
this.a = a;
}
// You can add functions to the prototype, but you can also
// declare functions and assign them to this.functionName in the constructor.
Demo.prototype.test = function()
{
alert(this.a);
}
d = new Demo('Hello world');
d.test();
所以从来没有“类”或“对象”或类似的东西,我仍然使用面向对象的模型。 此外,任何“松散”函数实际上都是窗口对象的一种方法,就像任何变量都是窗口对象的属性一样。所以JavaScript完全是OO,尽管它很难隐藏这个事实。 :d