javascript - 为 declare 解释这个令人困惑的 dojo 教程语法

标签 javascript dojo javascript-framework declare

我正在阅读使用 dojo's declare 的语法用于创建类。描述令人困惑:

The declare function is defined in the dojo/_base/declare module. declare accepts three arguments: className, superClass, and properties.
ClassName

The className argument represents the name of the class, including the namespace, to be created. Named classes are placed within the global scope. The className can also represent the inheritance chain via the namespace.
Named Class

// Create a new class named "mynamespace.MyClass"
declare("mynamespace.MyClass", null, {

    // Custom properties and methods here

});

A class named mynamespace.MyClass is now globally available within the application.

Named classes should only be created if they will be used with the Dojo parser. All other classes should omit the className parameter.
"Anonymous" Class

// Create a scoped, anonymous class
var MyClass = declare(null, {

    // Custom properties and methods here

});

The MyClass is now only available within its given scope.
SuperClass(es)

The SuperClass argument can be null, one existing class, or an array of existing classes. If a new class inherits from more than one class, the first class in the list will be the base prototype, the rest will be considered "mixins".
Class with No Inheritance

var MyClass = declare(null, {

    // Custom properties and methods here

});

null signifies that this class has no classes to inherit from.
Class Inheriting from Another Class

var MySubClass = declare(MyClass, {

    // MySubClass now has all of MyClass's properties and methods
    // These properties and methods override parent's

});

创建非命名类和没有父类(super class)的类的语法完全相同:

var MyClass = declare(null, {
    // Custom properties and methods here  
});

我希望没有任何父类(super class)和任何名称的类的语法如下所示:

var MyClass = declare(null, null, {
    // Custom properties and methods here  
});

我来自类型化语言背景,所以我可能误解了它在 JavaScript 中的工作原理。如果教程语法正确,我无法理解阅读代码(没有任何评论)的人如何知道两者之间的区别。

我希望语法是这样的:

/*class without a name:*/ declare(null, SuperClass, {})

/*class without a name or super class:*/ declare(null, null, {})

/*class with a name but no super class:*/ declare("ClassName", null, {})

也许这很冗长,但至少很容易分辨每个参数的用途。

最佳答案

好吧,把它当作一个重载的构造函数:

// class with a name
declare(className: String, superClass: Array, classDeclaration: Object);

// class without a name
declare(superClass: Array, classDeclaration: Object);

使用空数组 []null 表示没有 superClass

注意:从 Dojo 1.8 开始,不需要命名类,因为 dojo/parser 可以使用模块 ID(mid,例如 "mynamespace/MyClass") 用于实例化。我认为命名类已经过时并且不利于代码的可维护性。

关于javascript - 为 declare 解释这个令人困惑的 dojo 教程语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13472453/

相关文章:

javascript - 我如何开始使用 JavaScriptMVC?

javascript - Backbone.js vs Express vs Next JS ...和JSP?

javascript - "Thin"跨浏览器脚本的 JavaScript 框架?

javascript - 如何在 Dojo StackContainer 中禁用热键

javascript - 如果没有带有类的子元素,则给出父类

javascript - 从右向左追加 div

javascript - 当用户单击/移出文本框时删除错误验证消息

java - 是否有为 Spring 3 REST Controller 生成 JSON SMD 的解决方案?

javascript - 在 Dojo 中从 Json 创建动态页面

javascript - 当 jquery load() 完成时设置输入值