Core
Qooxdoo的Core不是一个组件,但是却包括了qooxdoo类库的所有核心功能。下面所列的核心功能可以在所有qooxdoo组成部分中(如Desktop, Mobile, Website或者Server)使用。Core由用户类属性、数据绑定和运行时环境组成。
建议你至少要通过这章的介绍学会qooxdoo面向对象,面向对象的特性和类的面向对象部分,这些都是qooxdoo类系统的基础。其他章节可以在需要的时候再学习。
2.1 面向对象
2.1.1 面向对象介绍
qooxdoo允许您在不修改原生JavaScript的基础上非常方便地使用许多面向对象编程的概念。Qooxdoo面向对象的主要成员有:
• Classes
• Interfaces
• Mixins
当你想深入学习qooxdoo框架代码时,你应该学会这三个概念。而作为一个普通应用开发者,在刚开始学习和使用qooxdoo时你可以忽略Interfaces和Mixins这两个概念。
Classes
“Classes”是大多数面向对象语言的核心概念。通常被称为“类”,作为一个程序员你应该非常熟悉它。qooxdoo类声明使用一种“闭包”的形式,即整个声明都在qx.Class.define(name,config)的内部声明,name是一个全局唯一的类名称,config是一个由各种键值对(或“sections”)组成的配置映射。
下面是几个通过指定配置来区分类型的常用类,:
•普通类:含有类变量,类方法(在statics节中)和实例变量、方法(在members节中)。类的实例可以使用new关键字建立,因此每个类需要有一个构造函数。
•静态类:只包含类变量和类方法。通常是一个辅助类或实用程序类。类型关键字:static
•抽象类:不允许创建实例的类。通常从它继承具体的实现类。类型关键字:abstract。
•单例类:在任何时候只允许存在一个实例的类。这个类通过一个静态方法getInstance()来返回实例。类型关键字:singleton。
Interfaces
Qooxdoo提供了类似于Java的接口类型。通过qx.Interface.define(name,config)来定义。接口通常包含一组空方法,继承这个接口的类必须将所有的方法都进行具体实现。
mixins
mixin是一个非常实用的概念,但并不是所有编程语言都提供。与接口需要一个继承类来提供具体实现不一样,mixin包含代码。这些代码通常是实现一些通用的、常用的具体功能。各个不同的类通过引用mixin这个概念来引入这些功能。mixin通常只涉及某一方面的功能,因此往往规模较小。Mixins使用qx.Mixin.define(name,config)进行声明。
Inheritance
和大多数编程语言一样qooxdoo类也只允许单一继承,不允许多继承,即一个类只能有一个父类,父类通过在类的config节中使用extend这个关键字进行声明。
类可以通过implement/include引入一个或多个interfaces/ mixin对类进行扩展,这是一种间接的实现多继承的形式。
2.1.2 面向对象的特性
类定义
通过为类提供一个字符串名称来定义类:
qx.Class.define(“my.cool.Class”);
这个例子仅仅创建一个简单的类my.cool.Class。一个典型的类定义所包含的构造函数、实例成员、静态成员等作为类定义的第二个参数通过键值对的形式进行定义。因为整个类定义都是在qx.Class.define()中进行说明,所以它被称为“闭包”类声明:
qx.Class.define("my.cool. Class", {
// declare constructor, members, ...
});
普通(非静态)类使用new关键字进行实例化:
var myClass = new my.cool.Class;
Inheritance(继承)
为了从另一个类中继承,qooxdoo利用extend关键字在类定义中对父类进行引用:
qx.Class.define("my.great. SuperClass",{
// I’m the super class
});
qx.Class.define("my.cool. Class",{
extend : my.great.SuperClass
});
Constructor(构造函数)
普通类使用construct关键字对类的构造函数进行声明:
qx.Class.define("my.cool.Class",{
extend : my.great.SuperClass,
construct : function() {
}
});
Static(静态成员)
静态成员(通常称为“类成员”)在类定义中的config部分通过键值对的形式以关键字statics进行声明。静态方法以一个函数声明方式进行声明。通常用大写字母区来与实例成员进行区分:
qx.Class.define("my.cool.Class",{
statics :{
FOO : VALUE,
BAR : function() { ... }
}
});
静态成员,方法和属性,可以直接使用类名访问:
my.cool.Class. FOO = 3.141;
my.cool.Class.BAR();
注意:您可以将静态成员作为常量来使用,但它们的值可以在运行时被改变! !
Instance(实例成员)
和静态成员定义一样,实例成员也在类定义的config节中进行定义,它以memebers关键字标识:
qx.Class.define("my.cool.Class",{
members:{
foo : VALUE,
Bar : function() { ... }
}
});
实例成员必须通过类的实例进行访问:
var myClass1 = new my.cool.Class;
myClass1. foo = 3.141;
myClass1.bar();
访问静态成员
下面代码说明了在访问静态成员时如果类名进行了改变,访问代码不需要更新,且这段代码在应用build时可以进行性能优化。
qx.Class.define("my.cool.Class",{
statics : {
PI:3.141
},
members : {
circumference : function(radius) {
return 2 * this.self(arguments).PI * radius;
}
}
});
注意:只有直接或间接继承qx.core.Object的类中self关键字才是有效的。
注意:静态成员不能被继承。如果调用父类的静态方法,你必须使用superclass关键字,如下面的这个例子:
qx.Class. define(‘A’,{
statics: {
f:function() {}
}
});
qx.Class.define(‘B’), {
extend: A,
members: {
e:function() {
this.superclass.self(arguments).f();
}
}
});
静态函数可以通过this关键词直接访问其他静态函数。
调用父类的构造函数
下面的代码在父类的类名称发生改变时,访问代码不需要更新。代码将在应用build进进行优化处理。
qx.Class.define("my.cool.Class",{
extend : my.great.SuperClass,
construct : function(x) {
this.base(arguments, x);
}
});
调用并覆盖父类方法
常规形态不使用prototype关键字。在父类的类名称发生改变时,访问代码不需要更新。代码将在应用build进进行优化处理。
qx.Class.define("my.cool.Class",{
extend : my.great.SuperClass,
members : {
foo : function(x) {
this.base(arguments,x);
}
}
});
Destructor(析构函数)
作为与构造函数相对应的析构函数,通过destruct关键字进行声明:
qx.Class.define("my.cool.Class",{
extend : my.great.SuperClass,
construct : function() {}
destruct : function() {}
});
Properties(属性)
qooxdoo内置了一个非常强大的被称为动态属性的功能。对年龄的属性的简明声明如下:
qx.Class.define(‘A’,{
properties : {
age: { init: 10, check: "Integer" }
}
})
这个声明不仅会自动生成年龄的访问方法getAge()和赋值方法setAge(),还可以增加许多非常有用的功能(后面会详细说明)。
Interfaces(接口)
接口的命名约定是接口名称的第一个字母使用大写字母I。
qx.Interface.define(“my.cool.IInterface”);
Mixins
Mixin的命名约定是mixin名称的第一个字母使用大写字母M。mixin可以具有一个类的一切,如属性、构造函数、析构函数和成员等等。
qx.Mixin.define("my.cool.MMixin");
在类中引用mixins
在类的定义中使用include关键字引用一个mixin或多个mixin组成的数组。
qx.Class.define("my.cool.Class",{
include : [my.cool. MMixin, my.other.cool.MMixin]
});
对于一个已经定义的类可以使用下面的方法引入mixin:
qx.Class.include(qx.ui.core. Widget, qx.MWidgetExtensions);
类成员访问控制
通过以下命名约定,来控制类成员的访问。在应用构建过程时私有成员被重命名为随机名称以确保他们不能从外面类进行访问。
publicMember
_protectedMember
__privateMember
Static classes(静态类)
在开发过程中系统会对声明为静态的类做一些功能检查。如:构造函数或实例成员就不允许出现在静态类的声明中。
qx.Class.define("my.cool. Class", {
type : "static"
});
Abstract classes(抽象类)
声明为抽象的类在开发过程中系统会检查类中是否存在实现代码,抽象类是不允许存在实现代码的。
qx.Class.define("my.cool. Class", {
type : "abstract"
});
Singletons(单例类)
声明为单例类的类在开发过程中系统会自动进行检查是否存在多个实例。它只允许使用getInstance()方法来得到单例类的实例,在任何时候它只允许存在一个实例。
qx.Class.define("my.cool.Class",{
type : "singleton",
extend : my.great.SuperClass
});
立即访问之前定义的成员
闭包形式定义的类成员之间是不允许直接访问的,因为各个成员都是配置数据结构本身的一部分。但这种直接访问的功能还需要经常使用,为了解决这个问题,qooxdoo使用一个defer方法(在类定义中所有设置部分都完成后进行调用)来访问所有先前定义的静态成员,实例成员和动态属性。
注意:如果访问之前定义的成员这个功能不是必须的,那么最好不要使用defer这个方法,因为相对于通用的成员它缺少一些重要的功能,而且它也不能利用build过程的许多高级特性(如文档、优化等)。
qx.Class.define("my.cool.Class",
{
statics:{
driveLetter : "C"
},
defer : function(statics, members, properties){
statics.drive = statics. driveLetter + ":\\";
members.whatsTheDrive = function() {
return "Drive is " + statics.drive;
};
}
});
浏览器特定的方法
为了保持闭包形式,为不同浏览器实现不同方法这个功能将根据环境设置来完成。Qooxdoo的generator工具将根据环境设置(可选)保留每个特定浏览器的代码而删除所有其他浏览器的实现代码,从而生成特定于某个浏览器的高性能的版本。环境变量之间可以使用or这个关键字。如果没有变量匹配,使用“default”关键字:
members:
{
foo: qx.core.Environment.select("engine.name",{
"mshtml|opera": function() {
// Internet Explorer or Opera
},
"default": function() {
// All other browsers
}
})
(Event)事件
qooxdoo类定义了一个特殊的event关键字。这个键的值是一个键值对映射,它将每个事件名称映射为具体的事件类,并将事件名称传递给类实例的事件侦听器。qooxdoo事件系统现在可以(可选)检测出事件类型是否被支持,如果一个事件类型是未知的,系统可以自动发出一个警告。这将确保每种列出的事件映射都会受到系统支持。
qx.Class.define("my.eventful.Class",{
extend: qx.core.Target,
events :
{
/** Fired when the widget is clicked. */
"click": "qx.event.type.MouseEvent"
}
Qooxdoo的Core不是一个组件,但是却包括了qooxdoo类库的所有核心功能。下面所列的核心功能可以在所有qooxdoo组成部分中(如Desktop, Mobile, Website或者Server)使用。Core由用户类属性、数据绑定和运行时环境组成。
建议你至少要通过这章的介绍学会qooxdoo面向对象,面向对象的特性和类的面向对象部分,这些都是qooxdoo类系统的基础。其他章节可以在需要的时候再学习。
2.1 面向对象
2.1.1 面向对象介绍
qooxdoo允许您在不修改原生JavaScript的基础上非常方便地使用许多面向对象编程的概念。Qooxdoo面向对象的主要成员有:
• Classes
• Interfaces
• Mixins
当你想深入学习qooxdoo框架代码时,你应该学会这三个概念。而作为一个普通应用开发者,在刚开始学习和使用qooxdoo时你可以忽略Interfaces和Mixins这两个概念。
Classes
“Classes”是大多数面向对象语言的核心概念。通常被称为“类”,作为一个程序员你应该非常熟悉它。qooxdoo类声明使用一种“闭包”的形式,即整个声明都在qx.Class.define(name,config)的内部声明,name是一个全局唯一的类名称,config是一个由各种键值对(或“sections”)组成的配置映射。
下面是几个通过指定配置来区分类型的常用类,:
•普通类:含有类变量,类方法(在statics节中)和实例变量、方法(在members节中)。类的实例可以使用new关键字建立,因此每个类需要有一个构造函数。
•静态类:只包含类变量和类方法。通常是一个辅助类或实用程序类。类型关键字:static
•抽象类:不允许创建实例的类。通常从它继承具体的实现类。类型关键字:abstract。
•单例类:在任何时候只允许存在一个实例的类。这个类通过一个静态方法getInstance()来返回实例。类型关键字:singleton。
Interfaces
Qooxdoo提供了类似于Java的接口类型。通过qx.Interface.define(name,config)来定义。接口通常包含一组空方法,继承这个接口的类必须将所有的方法都进行具体实现。
mixins
mixin是一个非常实用的概念,但并不是所有编程语言都提供。与接口需要一个继承类来提供具体实现不一样,mixin包含代码。这些代码通常是实现一些通用的、常用的具体功能。各个不同的类通过引用mixin这个概念来引入这些功能。mixin通常只涉及某一方面的功能,因此往往规模较小。Mixins使用qx.Mixin.define(name,config)进行声明。
Inheritance
和大多数编程语言一样qooxdoo类也只允许单一继承,不允许多继承,即一个类只能有一个父类,父类通过在类的config节中使用extend这个关键字进行声明。
类可以通过implement/include引入一个或多个interfaces/ mixin对类进行扩展,这是一种间接的实现多继承的形式。
2.1.2 面向对象的特性
类定义
通过为类提供一个字符串名称来定义类:
qx.Class.define(“my.cool.Class”);
这个例子仅仅创建一个简单的类my.cool.Class。一个典型的类定义所包含的构造函数、实例成员、静态成员等作为类定义的第二个参数通过键值对的形式进行定义。因为整个类定义都是在qx.Class.define()中进行说明,所以它被称为“闭包”类声明:
qx.Class.define("my.cool. Class", {
// declare constructor, members, ...
});
普通(非静态)类使用new关键字进行实例化:
var myClass = new my.cool.Class;
Inheritance(继承)
为了从另一个类中继承,qooxdoo利用extend关键字在类定义中对父类进行引用:
qx.Class.define("my.great. SuperClass",{
// I’m the super class
});
qx.Class.define("my.cool. Class",{
extend : my.great.SuperClass
});
Constructor(构造函数)
普通类使用construct关键字对类的构造函数进行声明:
qx.Class.define("my.cool.Class",{
extend : my.great.SuperClass,
construct : function() {
}
});
Static(静态成员)
静态成员(通常称为“类成员”)在类定义中的config部分通过键值对的形式以关键字statics进行声明。静态方法以一个函数声明方式进行声明。通常用大写字母区来与实例成员进行区分:
qx.Class.define("my.cool.Class",{
statics :{
FOO : VALUE,
BAR : function() { ... }
}
});
静态成员,方法和属性,可以直接使用类名访问:
my.cool.Class. FOO = 3.141;
my.cool.Class.BAR();
注意:您可以将静态成员作为常量来使用,但它们的值可以在运行时被改变! !
Instance(实例成员)
和静态成员定义一样,实例成员也在类定义的config节中进行定义,它以memebers关键字标识:
qx.Class.define("my.cool.Class",{
members:{
foo : VALUE,
Bar : function() { ... }
}
});
实例成员必须通过类的实例进行访问:
var myClass1 = new my.cool.Class;
myClass1. foo = 3.141;
myClass1.bar();
访问静态成员
下面代码说明了在访问静态成员时如果类名进行了改变,访问代码不需要更新,且这段代码在应用build时可以进行性能优化。
qx.Class.define("my.cool.Class",{
statics : {
PI:3.141
},
members : {
circumference : function(radius) {
return 2 * this.self(arguments).PI * radius;
}
}
});
注意:只有直接或间接继承qx.core.Object的类中self关键字才是有效的。
注意:静态成员不能被继承。如果调用父类的静态方法,你必须使用superclass关键字,如下面的这个例子:
qx.Class. define(‘A’,{
statics: {
f:function() {}
}
});
qx.Class.define(‘B’), {
extend: A,
members: {
e:function() {
this.superclass.self(arguments).f();
}
}
});
静态函数可以通过this关键词直接访问其他静态函数。
调用父类的构造函数
下面的代码在父类的类名称发生改变时,访问代码不需要更新。代码将在应用build进进行优化处理。
qx.Class.define("my.cool.Class",{
extend : my.great.SuperClass,
construct : function(x) {
this.base(arguments, x);
}
});
调用并覆盖父类方法
常规形态不使用prototype关键字。在父类的类名称发生改变时,访问代码不需要更新。代码将在应用build进进行优化处理。
qx.Class.define("my.cool.Class",{
extend : my.great.SuperClass,
members : {
foo : function(x) {
this.base(arguments,x);
}
}
});
Destructor(析构函数)
作为与构造函数相对应的析构函数,通过destruct关键字进行声明:
qx.Class.define("my.cool.Class",{
extend : my.great.SuperClass,
construct : function() {}
destruct : function() {}
});
Properties(属性)
qooxdoo内置了一个非常强大的被称为动态属性的功能。对年龄的属性的简明声明如下:
qx.Class.define(‘A’,{
properties : {
age: { init: 10, check: "Integer" }
}
})
这个声明不仅会自动生成年龄的访问方法getAge()和赋值方法setAge(),还可以增加许多非常有用的功能(后面会详细说明)。
Interfaces(接口)
接口的命名约定是接口名称的第一个字母使用大写字母I。
qx.Interface.define(“my.cool.IInterface”);
Mixins
Mixin的命名约定是mixin名称的第一个字母使用大写字母M。mixin可以具有一个类的一切,如属性、构造函数、析构函数和成员等等。
qx.Mixin.define("my.cool.MMixin");
在类中引用mixins
在类的定义中使用include关键字引用一个mixin或多个mixin组成的数组。
qx.Class.define("my.cool.Class",{
include : [my.cool. MMixin, my.other.cool.MMixin]
});
对于一个已经定义的类可以使用下面的方法引入mixin:
qx.Class.include(qx.ui.core. Widget, qx.MWidgetExtensions);
类成员访问控制
通过以下命名约定,来控制类成员的访问。在应用构建过程时私有成员被重命名为随机名称以确保他们不能从外面类进行访问。
publicMember
_protectedMember
__privateMember
Static classes(静态类)
在开发过程中系统会对声明为静态的类做一些功能检查。如:构造函数或实例成员就不允许出现在静态类的声明中。
qx.Class.define("my.cool. Class", {
type : "static"
});
Abstract classes(抽象类)
声明为抽象的类在开发过程中系统会检查类中是否存在实现代码,抽象类是不允许存在实现代码的。
qx.Class.define("my.cool. Class", {
type : "abstract"
});
Singletons(单例类)
声明为单例类的类在开发过程中系统会自动进行检查是否存在多个实例。它只允许使用getInstance()方法来得到单例类的实例,在任何时候它只允许存在一个实例。
qx.Class.define("my.cool.Class",{
type : "singleton",
extend : my.great.SuperClass
});
立即访问之前定义的成员
闭包形式定义的类成员之间是不允许直接访问的,因为各个成员都是配置数据结构本身的一部分。但这种直接访问的功能还需要经常使用,为了解决这个问题,qooxdoo使用一个defer方法(在类定义中所有设置部分都完成后进行调用)来访问所有先前定义的静态成员,实例成员和动态属性。
注意:如果访问之前定义的成员这个功能不是必须的,那么最好不要使用defer这个方法,因为相对于通用的成员它缺少一些重要的功能,而且它也不能利用build过程的许多高级特性(如文档、优化等)。
qx.Class.define("my.cool.Class",
{
statics:{
driveLetter : "C"
},
defer : function(statics, members, properties){
statics.drive = statics. driveLetter + ":\\";
members.whatsTheDrive = function() {
return "Drive is " + statics.drive;
};
}
});
浏览器特定的方法
为了保持闭包形式,为不同浏览器实现不同方法这个功能将根据环境设置来完成。Qooxdoo的generator工具将根据环境设置(可选)保留每个特定浏览器的代码而删除所有其他浏览器的实现代码,从而生成特定于某个浏览器的高性能的版本。环境变量之间可以使用or这个关键字。如果没有变量匹配,使用“default”关键字:
members:
{
foo: qx.core.Environment.select("engine.name",{
"mshtml|opera": function() {
// Internet Explorer or Opera
},
"default": function() {
// All other browsers
}
})
(Event)事件
qooxdoo类定义了一个特殊的event关键字。这个键的值是一个键值对映射,它将每个事件名称映射为具体的事件类,并将事件名称传递给类实例的事件侦听器。qooxdoo事件系统现在可以(可选)检测出事件类型是否被支持,如果一个事件类型是未知的,系统可以自动发出一个警告。这将确保每种列出的事件映射都会受到系统支持。
qx.Class.define("my.eventful.Class",{
extend: qx.core.Target,
events :
{
/** Fired when the widget is clicked. */
"click": "qx.event.type.MouseEvent"
}
})
利用翻译软件并通过自己的理解做出以上文章,如有不妥,欢迎指正chshj@126.com