哪个JavaScript库具有最全面的类继承支持?

20

在尝试了诸如Prototype、jQuery、YUI等十几个不同的JavaScript库之后,我发现每个库都有不同的方式来模拟某种类层次结构并提供某种类继承支持。(除了jQuery)除了非常烦恼创建新类时需要依赖于特定库,否则只能使用传统的方式。

我想知道哪个库通常提供最好的类继承支持以及原因。

我希望也许有一天JavaScript库的作者可以就类创建和继承达成一致的风格。


这个问题与同一主题有关:https://dev59.com/eWs05IYBdhLWcg3wCNlG。 - Anderson Green
4
威尔,你应该停止关闭这样的问题。这个问题非常有建设性。你通过关闭这个问题而变得具有破坏性。谢谢你的"贡献"。 - B T
ExtJS拥有非常全面的类系统。 - Oliver Watkins
9个回答

8
我发现有一个基于Ruby模型的Javascript框架:

Js.Class

另一个好的框架是:

Joose-js(基于moose(perl))

我更喜欢Joose,因为它似乎正在积极开发中,语法看起来也很整洁!

有什么想法吗?(也许这应该是另一个问题?)


2
抱歉,我无耻地将自己标记为首选答案! - Aaron Qian
取消将自己标记为首选答案。事实上,这个问题没有“正确”的答案。 - Aaron Qian

7

我认为Microsoft Ajax 完美地实现了它(使用命名空间、继承和接口等)。

示例:

Type.registerNamespace("Demo");

Demo.Person = function(firstName, lastName, emailAddress) {
    this._firstName = firstName;
    this._lastName = lastName;
    this._emailAddress = emailAddress;
}

Demo.Person.prototype = {

    getFirstName: function() {
        return this._firstName;
    },

    getLastName: function() {
        return this._lastName;
    },

    getName: function() {
        return this._firstName + ' ' + this._lastName;
    },

    dispose: function() {
        alert('bye ' + this.getName());
    }
}
Demo.Person.registerClass('Demo.Person', null, Sys.IDisposable);

// Notify ScriptManager that this is the end of the script.
if (typeof(Sys) !== 'undefined') Sys.Application.notifyScriptLoaded();

文档:http://msdn.microsoft.com/zh-cn/library/bb310848(v=vs.100).aspx - B T

7
你应该尝试使用Classy:
它简单、体积小,但在构建类时我需要的一切都有。 http://classy.pocoo.org/

5

请查看Prototype。这是一个示例:

// properties are directly passed to `create` method
var Person = Class.create({
  initialize: function(name) {
    this.name = name;
  },
  say: function(message) {
    return this.name + ': ' + message;
  }
});

// when subclassing, specify the class you want to inherit from
var Pirate = Class.create(Person, {
  // redefine the speak method
  say: function($super, message) {
    return $super(message) + ', yarr!';
  }
});

var john = new Pirate('Long John');
john.say('ahoy matey');
// -> "Long John: ahoy matey, yarr!"

5

Base2具有简单的继承机制,可参考John Resig的博客文章(该博客中的评论也很有趣)。

需要记住的一点是,最近在JavaScript中模拟经典面向对象编程受到了很多批评(尽管在伟大的JS库革命的初期非常热衷于探索此方面)。


第二段有任何参考资料吗?谢谢! - Aaron Qian
这篇关于编程的文章看起来非常有趣,尤其是其中的结论。可惜找不到Crockford关于这个主题的演讲内容。 - Surya
1
尽管我同意 Crockford 的观点,即 Javascript 的原型比静态继承更强大(或至少同样有用),但他的“证明”是发明了新术语(“特权方法”、“寄生式继承”等),然后展示了很多框架可以做什么,这些框架被认为是语法糖。对我来说这并不是证明,只是另一个继承框架,而且并不是那么好用。 - Guss
1
如果你想要一个独立于库的方法,那就学习在没有各种库的抽象下完成这个操作。一旦你走几遍这个过程,就不会特别困难,并且你可以获得更精细的控制水平。但是Crockford的观点更大:在一段时间后,你会发现类层次结构并不总是最方便的方式来模拟你的问题领域。 - Weston C
1
《JavaScript Patterns》是Stoyan Stefanov所著,提供了有关原型/闭包构造的更高层次视角,并可能提供有关jQuery、YUI和其他库如何实现它们的见解。我建议在阅读《JavaScript语言精粹》之后(以及在阅读《高性能JavaScript》之前)阅读它。它的大小类似,而且O'Reilly在Android市场上以很低的价格出售。 - Marco Mariani

2

您可能也对qooxdoo感兴趣,它是一种用于创建富互联网应用程序(RIAs)的框架。 它包括一个全面的OO层,旨在强大,优雅和快速:

请参见手册中的以下部分,其中包含所有细节: http://qooxdoo.org/documentation/0.8#object_orientation


1

我发现mootools对于继承来说是我所需要的一切。它使用了许多其他面向对象语言中的基本Extends和Implements主题。

其中一位开发者详细比较了它与jquery:

http://jqueryvsmootools.com

你也不需要整个库。你可以只下载他们的类模型,忽略其他部分(动画、DOM 操作等)。


1

只需选择你觉得最好的那个。归根结底,它们都在幕后使用原型继承,所以它们的功能水平大致相同。

如果你想要一个功能强大的传统类系统,可以使用GWT并纯粹地使用Java编程。

就个人而言,我更喜欢Ext的组件系统,因为Ext组件实际上具有完整的生命周期(初始化、渲染、状态持久化和销毁),这反过来允许组件插件不会因库的小更新而中断。


1
是的。Ext很好,我的公司在实际应用中使用了它,用于FIFA 2010项目。我们最终在Ext之上构建了一个框架,这非常令人兴奋。然而,我更喜欢joose-js,因为它比Ext的类系统具有更多功能。 :) - Aaron Qian

0

嗯,首先你应该问自己是否想要一个试图模拟经典继承的库,还是更倾向于JS的原生原型继承。

DUI(Digg用户界面库)是一个jQuery插件,它采用了Prototype的旧模型,并以一种更直观的方式进行了扩展,允许嵌套静态和动态类、命名空间、支持dontEnum位等。文档可在Digg's GitHub上找到。我认为你会发现它非常强大稳定。

声明:我在Digg工作并编写了DUI ;)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接