`
快乐的牛
  • 浏览: 74558 次
社区版块
存档分类
最新评论

Extjs 4入门 Javascript中的面向对象编程

 
阅读更多

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的成功帮助很大。

0
0
分享到:
评论

相关推荐

    extJS4 MVC demo项目入门

    在学习extJS4 MVC时,开发者还应掌握JavaScript面向对象编程的思想,以及如何高效利用extJS提供的各种组件和插件来构建用户界面。最后,通过项目实践不断优化和重构代码,提高应用的性能和用户体验。

    JavaScript和ExtJS及Ajax基础教程

    "javascript面向对象编程.ppt"将深入讲解JavaScript的面向对象特性,包括构造函数、原型、继承和模块化设计等。理解这些概念对于开发大型复杂项目至关重要。 "Ajax.ppt"则会详细阐述Ajax的工作原理、创建Ajax请求的...

    传智播客EXTJS视频下载地址

    - **资源推荐**:《传智播客成都中心JavaScript面向对象及ExtJS基础视频》中的AJAX章节(PPT格式),通过实例讲解了如何使用ExtJS进行AJAX调用。 2. **浏览器对象模型(BOM)**:这部分资料讲解了浏览器对象模型的...

    Extjs教程(javascript框架)

    ExtJS的核心编程理念是面向对象编程(OOP),这使得它具有极好的可扩展性,用户可以自定义扩展和命名空间。对于大型Web应用来说,由于其组件丰富,可能会显得较为庞大,但通过按需加载所需库,可以有效地减少资源...

    ExtJS-3.0.0.rar

    通过`javascript基础.ppt`和`javascript加强.ppt`,你可以进一步巩固JavaScript知识,而`javascript面向对象编程.ppt`将深入探讨JavaScript的OOP特性。结合这些资料,你将能够全面掌握使用ExtJS 3.0.0进行Web开发所...

    ExtJs 2.2 简明教程 01 入门

    其核心库提供了一个面向对象的编程模型,易于理解和使用,同时支持事件驱动的编程模式。 **2. Spket插件的安装** Spket是一款强大的JavaScript IDE插件,特别适用于Ext Js开发。它提供了代码自动完成、语法高亮、...

    Extjs4.0中文学习手册、入门详解

    - **系统类(class system)**:理解ExtJS的类系统是关键,它基于面向对象的设计,包括类、接口、继承、混合等概念。 - **编码和规范**:遵循Sencha的编码规范可以提高代码质量和可维护性。 - **DIY 亲自动手(示例...

    ExtJS中文手册.pdf

    - **继承机制**:ExtJS支持面向对象编程中的继承特性,可以扩展现有的组件类。 - **继承示例**:文档中给出了一些具体的继承示例,帮助理解继承的用法。 #### 22. 补充资料 - **Ext2概述**:介绍了ExtJS 2版本的...

    extJS 一些简单实例

    在源码方面,ExtJS 使用面向对象的编程方式,基于类的体系结构使得代码组织清晰且易于维护。例如,你可以定义一个自定义组件,继承自`Ext.Component`,并重写或扩展其方法和配置项来满足特定需求。 工具集是ExtJS的...

    ExtJS 3.2的中文参考手册

    - **继承机制**: 支持传统的面向对象编程中的继承特性,通过继承可以复用代码。 - **覆盖方法**: 子类可以覆盖父类的方法,实现更具体的功能。 #### 19. **EXT2概述** - **组件模型 (Component Model)**: 描述了...

    Extjs6示例中文版

    它采用了一种面向对象的编程模式,支持MVC(Model-View-Controller)和MVVM(Model-View-ViewModel)架构模式,这有助于组织和管理大型应用程序的代码结构。ExtJS的特点包括强大的UI组件库,复杂的布局管理,以及...

    EXTJS4.0详细教程

    EXTJS4的系统类(class system)是一套组织良好的面向对象设计,它包含了类的创建、继承和命名空间的使用。了解编码和规范可以帮助开发者写出更优雅、可维护的代码。DIY部分提供了实际操作的示例,通过动手实践来加深...

    extjs中文教程

    这部分介绍ExtJS面向对象编程(OOP)的基础知识,包括JavaScript类的定义、ExtJS命名空间的使用、ExtJS的类继承、配置选项、以及ExtJS的实用工具函数如Ext.apply()和Ext.applyIf()。这些基础知识点是学习ExtJS的基石...

    javascrip上百技术总集

    JavaScript极速狂飙:组合拼接字符串的效率 JavaScript极速狂飙:CSS样式表的背景渲染效率 JavaScript面向对象的支持--(1) JavaScript面向对象的支持--(2) JavaScript面向对象的支持--(3) JavaScript...

    ExtJS中文手册

    - **概念**: 继承是面向对象编程中的一个重要概念。 - **示例**: - 如何在ExtJS中实现继承。 #### 二十一、补充资料 - **Ext2概述**: 简介Ext2版本的新增特性和改进之处。 - **组件模型**: ComponentModel和...

    S2SH+mysql+Extjs4.1简单入门项目实例(包含表格,统计图表,表单等基础组件和swfupload多文件上传)

    4. **Extjs4.1**:Extjs是一个用于构建富客户端Web应用的JavaScript库。在这个项目中,它用于创建用户界面,包括表格、统计图表和表单等基础组件。Extjs4.1引入了许多改进,如新的布局管理器、优化的数据模型和更好...

    EXT从入门到精通(经典教程)

    ExtJS是一个广泛使用的前端...学习ExtJS涉及对RIA、AJAX、DOM操作、面向对象编程等概念的理解,以及对ExtJS组件和类层次结构的深入研究。掌握ExtJS不仅需要理论知识的学习,还需要通过大量的实践来提高编程技能。

    Ext入门学习.docx

    ExtJS 中的面向对象编程是通过 Ext.namespace() 函数来实现的,例如 Ext.namespace("Ext.cc");。 ExtJS 中的类继承是通过 prototype 属性来实现的,例如 Ext.cc.Class2.prototype = new Ext.cc.Class1();。 ExtJS 中...

    extjs 的一些学习笔记

    它的核心特性包括丰富的组件库、强大的数据包管理、灵活的布局系统以及面向对象的编程模型。以下是对ExtJS 入门学习的一些关键知识点的详细解释: 1. **核心改进**: - **框架架构重构**:ExtJS 4 对框架进行了...

Global site tag (gtag.js) - Google Analytics