1.在Javascript中直接使用对象
module("Javascript Class & Extjs Class")
test("Javascript Object", function() {
//直接使用对象
var bob = {
name : "bob",
age : 13
}
equal(bob.name, "bob")
equal(bob.age, 13)
//相当于
var jack = new Object()
jack.name = "jack"
jack.age = 14
equal(jack.name, "jack")
equal(jack.age, 14)
})
Javascript中的对象,相当于一个Map,就是属性名称和属性值的对应关系集合。
Javascript中除了基本类型:null,undefined,boolean,string,number之外,其他都是Object类型。
2.在Javascript中定义类
//定义一个People类
var People = function(name)
{
this.name = name;
this.say=function(){
return Ext.String.format("I'm {0}.",this.name)
}
}
var p = new People("Jack")
equal(p.name,"Jack")
equal(p.say(),"I'm Jack.")
new People("Jack")的执行过程是,先创建一个空对象,相当于:
var p = new Object
//或者
var p = {}
然后,将这空对象,作为函数的context(就是this引用的对象), 传递给函数,并调用这个函数(带上参数name)。(如果要改变一个函数内部this引用的对象,可以通过myfunction.call或者myfunction.apply调用myfunction,而不是直接调用myfunction() )
也就是说,相当于执行了如下代码:
p.name = name
p.say = function(){...}
也就是:
var p = {}
People.call(p,"David")
equal(p.name,"David")
equal(p.say(),"I'm David.")
上面的代码定义了People类,实现了OOP中的封装(封装了两个成员name 和 say())。
3.实现继承
Javascript中使用prototype来实现继承。prototype就是原型,“原型"很好理解,假如类型A的原型是B,那么B的属性就由A完全继承过来。
Javascript中的prototype也是一个对象。prototype这个对象的特殊意义在于:prototype的属性,将直接被其他对象继承,只要其他对象的prototype属性是它。
先从函数说起:
var People = function(name)
{
this.name = name
}
上面的函数People只是普通的javascript函数而已。但是,javascript函数如果和运算符new结合,它就变成了构造函数了;并且,javascript为了实现继承,每个函数都包含一个Prototype属性,这个属性的值默认就是一个空对象,也就是说,People.prototype = {} 。
执行下面的语句,定义People类型的对象:
var p = new People("Lucy");
除了上面介绍的new 创建对象过程外,Javascript还执行了如下操作:将对象p的原型,设置成People这个构造函数的原型,也就是上面介绍的空对象,相当于:p.prototype = Person.prototype,这就是javascript中每个函数都需要有一个prototype属性的原因:因为函数可能和new一起使用变成构造函数,构造函数创建的对象都必须有一个prototype属性,用于实现javascript中的继承。因此,每一个由People构造函数创建的对象,其原型都是上面说的空对象。
上面已经介绍过了,原型的作用就是,让其他对象直接继承它的属性。这里的“继承”,原理就是prototype链:程序读取对象p的属性name时,如果p对象本身不包含该属性,那么将读取p的原型(p.prototype)的name属性,如果p.prototype不包含name属性,那么继续尝试p.prototype的原型(p.prototype.prototype),直到原型为null为止。类似于下面代码展示的逻辑:
function read( identifier, object )
{
for( var element in object )
{
if( element == identifier )
{
return object.element;
}
}
if( object.constructor.prototype != null )
{
return read( identifier, object.constructor.prototype )
}
return undefined;
}
但是,设置对象p的属性name时(p.name = someValue),如果javascript发现对象p不包含name属性,将直接为p对象创建name属性然后赋值,和prototype没有关系。这点,将在下面的多态中讲到。
实现继承,就用prototype:
Student.prototype = new People(null)
//上面的语句相当于java语言中的Student extend People
function Student(name,studentNum)
{
Student.prototype.constructor.call(this,name)
//相当于java语言中的super(name)
this.studentNum=studentNum
}
var s = new Student("Lily","1234")
equal(s.name,"Lily") //name属性是继承prototype对象的
equal(s.studentNum,"1234")
用上面的方法实现继承,还有很多不完美的地方。网上有很多Javascript中实现继承的方法,但基本上都是以prototype为基础的。
4.实现多态
因为Javascript是脚本语言,对象没有类型的限制,因此原生支持多态:
test("Javascript polymorphism ",function(){
function Person()
{
this.say = function()
{
return "I'm a person."
}
}
function Student()
{
this.say = function(){
return "I'm a student."
}
}
function Worker()
{
this.say = function(){
return "I'm a worker."
}
}
var clowd =new Array( new Student(),new Worker(),new Person())
var words = ""
for(var i in clowd )
{
words += clowd[i].say()
//不管对象是什么类型,直接调用方法;javascript直接调用对象相应的方法,不会搞错。
}
equal(words,"I'm a student.I'm a worker.I'm a person.")
})
javascript的多态和继承结合起来讲,将说明javascript语言的另外一个特性:
var Person = function()
{
}
Person.prototype.say = function(){
return "person"
}
var bob = new Person()
equal(bob.say(),"person")
bob.say = function(){
return "bob"
}
equal(bob.say(),"bob")
equal(Person.prototype.say(),"person")
var jack = new Person()
equal(jack.say(),"person")
当为bob设置属性say时,就像上文所说的那样,由于bob对象本身并不包含say属性(它的say属性是从它的原型那里继承过来的,别忘了bob.prototype == Person.prototype),因此javascript将为bob对象创建say属性,并将新的函数赋给bob.say。但是,原型里的say属性并没有变,所有Person构造函数创建的对象,将继承那个原始的say属性。这样就实现了多态了,其他语言如java中的多态,都是靠子类重写父类的方法实现的,而javascript中实现这一点很简单。
实际上,java,C++等语言中,对象的行为(即方法)是由类定义的,而对象的状态是有每个对象自己保存的,也就是说,对象本身不会包含方法的代码,相同类的对象执行的方法都是同一个。但是javascript不一样,方法也是对象的一个属性,方法的内容由对象本身携带(如果是继承过来的,就由原型对象携带)。
在Extjs框架中,类型系统将变得更加OOP、更好理解,这一点,对于Extjs的成功帮助很大。
分享到:
相关推荐
在学习extJS4 MVC时,开发者还应掌握JavaScript面向对象编程的思想,以及如何高效利用extJS提供的各种组件和插件来构建用户界面。最后,通过项目实践不断优化和重构代码,提高应用的性能和用户体验。
"javascript面向对象编程.ppt"将深入讲解JavaScript的面向对象特性,包括构造函数、原型、继承和模块化设计等。理解这些概念对于开发大型复杂项目至关重要。 "Ajax.ppt"则会详细阐述Ajax的工作原理、创建Ajax请求的...
- **资源推荐**:《传智播客成都中心JavaScript面向对象及ExtJS基础视频》中的AJAX章节(PPT格式),通过实例讲解了如何使用ExtJS进行AJAX调用。 2. **浏览器对象模型(BOM)**:这部分资料讲解了浏览器对象模型的...
ExtJS的核心编程理念是面向对象编程(OOP),这使得它具有极好的可扩展性,用户可以自定义扩展和命名空间。对于大型Web应用来说,由于其组件丰富,可能会显得较为庞大,但通过按需加载所需库,可以有效地减少资源...
通过`javascript基础.ppt`和`javascript加强.ppt`,你可以进一步巩固JavaScript知识,而`javascript面向对象编程.ppt`将深入探讨JavaScript的OOP特性。结合这些资料,你将能够全面掌握使用ExtJS 3.0.0进行Web开发所...
其核心库提供了一个面向对象的编程模型,易于理解和使用,同时支持事件驱动的编程模式。 **2. Spket插件的安装** Spket是一款强大的JavaScript IDE插件,特别适用于Ext Js开发。它提供了代码自动完成、语法高亮、...
- **系统类(class system)**:理解ExtJS的类系统是关键,它基于面向对象的设计,包括类、接口、继承、混合等概念。 - **编码和规范**:遵循Sencha的编码规范可以提高代码质量和可维护性。 - **DIY 亲自动手(示例...
- **继承机制**:ExtJS支持面向对象编程中的继承特性,可以扩展现有的组件类。 - **继承示例**:文档中给出了一些具体的继承示例,帮助理解继承的用法。 #### 22. 补充资料 - **Ext2概述**:介绍了ExtJS 2版本的...
在源码方面,ExtJS 使用面向对象的编程方式,基于类的体系结构使得代码组织清晰且易于维护。例如,你可以定义一个自定义组件,继承自`Ext.Component`,并重写或扩展其方法和配置项来满足特定需求。 工具集是ExtJS的...
- **继承机制**: 支持传统的面向对象编程中的继承特性,通过继承可以复用代码。 - **覆盖方法**: 子类可以覆盖父类的方法,实现更具体的功能。 #### 19. **EXT2概述** - **组件模型 (Component Model)**: 描述了...
它采用了一种面向对象的编程模式,支持MVC(Model-View-Controller)和MVVM(Model-View-ViewModel)架构模式,这有助于组织和管理大型应用程序的代码结构。ExtJS的特点包括强大的UI组件库,复杂的布局管理,以及...
EXTJS4的系统类(class system)是一套组织良好的面向对象设计,它包含了类的创建、继承和命名空间的使用。了解编码和规范可以帮助开发者写出更优雅、可维护的代码。DIY部分提供了实际操作的示例,通过动手实践来加深...
这部分介绍ExtJS面向对象编程(OOP)的基础知识,包括JavaScript类的定义、ExtJS命名空间的使用、ExtJS的类继承、配置选项、以及ExtJS的实用工具函数如Ext.apply()和Ext.applyIf()。这些基础知识点是学习ExtJS的基石...
JavaScript极速狂飙:组合拼接字符串的效率 JavaScript极速狂飙:CSS样式表的背景渲染效率 JavaScript面向对象的支持--(1) JavaScript面向对象的支持--(2) JavaScript面向对象的支持--(3) JavaScript...
- **概念**: 继承是面向对象编程中的一个重要概念。 - **示例**: - 如何在ExtJS中实现继承。 #### 二十一、补充资料 - **Ext2概述**: 简介Ext2版本的新增特性和改进之处。 - **组件模型**: ComponentModel和...
4. **Extjs4.1**:Extjs是一个用于构建富客户端Web应用的JavaScript库。在这个项目中,它用于创建用户界面,包括表格、统计图表和表单等基础组件。Extjs4.1引入了许多改进,如新的布局管理器、优化的数据模型和更好...
ExtJS是一个广泛使用的前端...学习ExtJS涉及对RIA、AJAX、DOM操作、面向对象编程等概念的理解,以及对ExtJS组件和类层次结构的深入研究。掌握ExtJS不仅需要理论知识的学习,还需要通过大量的实践来提高编程技能。
ExtJS 中的面向对象编程是通过 Ext.namespace() 函数来实现的,例如 Ext.namespace("Ext.cc");。 ExtJS 中的类继承是通过 prototype 属性来实现的,例如 Ext.cc.Class2.prototype = new Ext.cc.Class1();。 ExtJS 中...
它的核心特性包括丰富的组件库、强大的数据包管理、灵活的布局系统以及面向对象的编程模型。以下是对ExtJS 入门学习的一些关键知识点的详细解释: 1. **核心改进**: - **框架架构重构**:ExtJS 4 对框架进行了...