在使用了十几个不同的 JavaScript 库(例如 Prototype、jQuery、YUI 等等)之后,我发现每个不同的库都有不同的方式来模拟某种类层次结构并提供某种类继承支持。(除了 jQuery)除了非常恼火的是,当你创建一个新类时,它必须依赖于库,除非你使用普通的旧方法。
我想知道哪个库通常为类继承提供最佳支持以及为什么。
我希望有一天 JavaScript 库的作者可以就类创建和继承的一种风格达成一致。
在使用了十几个不同的 JavaScript 库(例如 Prototype、jQuery、YUI 等等)之后,我发现每个不同的库都有不同的方式来模拟某种类层次结构并提供某种类继承支持。(除了 jQuery)除了非常恼火的是,当你创建一个新类时,它必须依赖于库,除非你使用普通的旧方法。
我想知道哪个库通常为类继承提供最佳支持以及为什么。
我希望有一天 JavaScript 库的作者可以就类创建和继承的一种风格达成一致。
我认为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();
查看原型。这是一个示例:
// 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!"
您可能还对 qooxdoo 感兴趣,这是一个用于创建富 Internet 应用程序 (RIA) 的框架。它包括一个全面的面向对象层,旨在强大、优雅和快速:
请参阅手册中的以下部分,其中包含所有详细信息:http: //qooxdoo.org/documentation/0.8#object_orientation
只需选择最适合您的“口味”。最后,它们都在幕后使用原型继承,因此它们都具有大致相同级别的功能。
如果您想要一个高性能的传统类系统,请使用 GWT 和纯 Java 编程。
我个人更喜欢 Ext 的组件系统,但那是因为 Ext 组件实际上有一个完整的生命周期(初始化、渲染、状态持久性和销毁),这反过来又允许组件插件不会因库的微小更新而中断。
我发现mootools是我继承所需的一切。它使用许多其他面向对象语言的扩展和实现的基本主题。
一位开发人员在与 jquery 的比较中详细介绍了它:
你也不需要整个图书馆。您可以只下载他们的 Class 模型而忽略其余部分(动画、dom 操作等)。
好吧,首先你应该问你是否想要一个试图模拟经典继承的库,或者一个更适合 JS 原生原型继承的库。
DUI(Digg 用户界面库)是一个 jQuery 插件,它采用 Prototype 的旧模型并以更直观的方式对其进行扩展,允许嵌套静态和动态类、命名空间、支持 dontEnum 位等等。Digg 的 GitHub 上提供了文档。我想你会发现它非常健壮。
披露:我为 Digg 工作并写了酒后驾车;)