【问题标题】:Which JavaScript Library Has the Most Comprehensive Class Inheritance Support? [closed]哪个 JavaScript 库具有最全面的类继承支持? [关闭]
【发布时间】:2010-10-17 04:59:34
【问题描述】:

在使用了十几个不同的 JavaScript 库(例如 Prototype、jQuery、YUI 等等)之后,我发现每个不同的库都有不同的方式来模拟某种类层次结构并提供某种类继承支持。 (除了 jQuery)除了非常恼火的是,当你创建一个新类时,它必须依赖于库,除非你使用普通的旧方法。

我想知道哪个库通常为类继承提供最好的支持,以及为什么。

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

【问题讨论】:

标签: javascript javascript-framework


【解决方案1】:

我认为 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();
【解决方案2】:

查看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!"

【讨论】:

    【解决方案3】:

    Base2 具有简单的继承机制,请参阅 John Resig 的 post (帖子中的 cmets 也很有趣)。

    还要记住的是,尝试在 Javascript 中模拟经典 OO 最近受到了很多批评(尽管在伟大的 JS 库革命的最初几天,人们非常热情地探索了它)。

    【讨论】:

    • 第二段有什么参考吗?谢谢!
    • javascript.crockford.com/inheritance.html ,文章中的结论似乎很有趣..找不到 Crockford 关于这个主题的演讲。
    • 虽然我同意 Crockford 的观点,即 Javascript 原型设计比静态继承更强大(或至少同样有用),但他的“证明”是他发明了新术语(“特权方法”、“寄生继承”、等等')然后展示了你可以用很多与语法糖有关的框架来做什么。这对我来说没有任何证据,只是另一个不能很好地工作的继承框架。
    • +1:如果您想要一个独立于库的方法,请学习在没有各种库的抽象的情况下执行此操作。一旦你走过它几次,这并不是特别困难,而且你会获得更好的控制水平。但 Crockford 的观点远不止于此:一段时间后,您开始发现类层次结构并不总是对问题域建模最方便的方法。
    • Stoyan Stefanov 的 Javascript 模式提供了关于原型/闭包结构的更高级别的视图,并且可以提供有关 jQuery、YUI 和朋友如何实现它们的见解。我建议在 The Good Parts 之后(以及 High Performance Javascript 之前)阅读它。它的大小相似,O'Reilly 在 Android 市场上以花生的价格出售它。
    【解决方案4】:

    嗯,首先你应该问一下你是否想要一个试图模拟经典继承的库,还是更适合 JS 原生原型继承的库。

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

    披露:我为 Digg 工作并编写了 DUI ;)

    【讨论】:

      【解决方案5】:

      我发现有一个以 Ruby 为模型的 Javascript 框架:

      Js.Class

      另一个不错的是:

      Joose-js(模仿 moose (perl))

      我更喜欢 Josse,因为它似乎开发得更加积极,而且语法看起来也很整洁!

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

      【讨论】:

      • 对不起,我无耻地将自己标记为首选答案!
      • 未将自己标记为首选答案。事实上,这个问题没有正确答案。
      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

        我发现mootools 是我继承所需的一切。它使用了许多其他面向对象语言的扩展和实现的基本主题。

        其中一位开发人员在与 jquery 的比较中详细介绍了它:

        http://jqueryvsmootools.com

        您也不需要整个库。您可以只下载他们的 Class 模型而忽略其余部分(动画、dom 操作等)。

        【讨论】:

          【解决方案8】:

          你应该试试优雅:

          http://classy.pocoo.org/

          它很简单而且非常小,但在构建我的类时拥有我需要的一切。

          【讨论】:

            【解决方案9】:

            只需选择最适合您的“口味”。最后,它们都在幕后使用原型继承,因此它们都具有大致相同级别的功能。

            如果您想要一个高性能的传统类系统,请使用 GWT 和纯 Java 编程。

            我个人更喜欢 Ext 的组件系统,但那是因为 Ext 组件实际上有一个full lifecycle(初始化、渲染、状态持久性和销毁),这反过来又允许组件插件不会因库的微小更新而中断。

            【讨论】:

            • 是的。 Ext 很好,我的公司实际上在 FIFA 2010 中使用的项目中使用了它。我们最终在 Ext 之上构建了一个框架,这非常令人兴奋。但是,我更喜欢 joose-js,因为它比 Ext 的类系统具有更多的功能。 :)
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-11-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多