JavaScript面向对象简介JavaScript 的核心是支持面向对象的,同时它也提供了强大灵活的OOP 语言能力。
本文从对面向对象编程的介绍开始,带您探索JavaScript 的对象模型,最后描述 JavaScript 当中面向对象编程的一些概念。
复习JavaScript如果您对JavaScript 的概念(如变量、类型、方法和作用域等)缺乏自信,您可以在重新介绍JavaScript这篇文章里学习这些概念。
您也可以查阅这篇JavaScript 1.5 核心指南。
面向对象编程面向对象编程是用抽象方式创建基于现实世界模型的一种编程模式。
它使用先前建立的范例,包括模块化,多态和封装几种技术。
今天,许多流行的编程语言(如Java,JavaScript,C#,C+ +,Python,PHP,Ruby 和Objective-C)都支持面向对象编程(OOP)。
面向对象编程可以看作是使用一系列对象相互协作的软件设计,相对于传统观念,一个程序只是一些函数的集合,或简单的计算机指令列表。
在OOP中,每个对象能够接收邮件,处理数据和发送消息给其他对象。
每个对象都可以被看作是一个独立的小机器有不同的作用和责任。
面向对象程序设计的目的是促进更好的编程灵活性和可维护性,并在大型软件工程中广为流行。
凭借其十分注重的模块化,面向对象的代码开发更简单,往后维护更容易理解,使其自身能更直接的分析,编码,理解复杂的情况和过程,比非模块化编程方法省事。
1术语Namespace 命名空间允许开发人员在一个专用的名称下捆绑所有功能代码的容器。
Class 类定义对象的特征。
Object 对象类的一个实例。
Property 属性对象的特征,比如颜色。
Method 方法对象的能力,比如行走。
Constructor 构造函数实例化时调用的函数。
Inheritance 继承一个类可以继承另一个类的特征。
Encapsulation 封装类定义了对象的特征,方法只定义了方法如何执行。
Abstraction 抽象结合复杂的继承,方法,属性,一个对象能够模拟现实的模型。
Polymorphism 多态多意为‘许多’,态意为‘形态’。
不同类可以定义相同的方法或属性。
更多关于面向对象编程的描述,请参照维基百科的面向对象编程。
原型编程基于原型的编程不是面向对象编程中体现的风格,且行为重用(在基于类的语言中也称为继承)是通过装饰它作为原型的现有对象的过程实现的。
这种模式也被称为弱类化,原型化,或基于实例的编程。
原始的(也是最典型的)基于原型语言的例子是由大卫·安格尔和兰德尔·史密斯开发的。
然而,弱类化的编程风格近来变得越来越流行,并已被诸如JavaScript,Cecil,NewtonScript,IO,MOO,REBOL,Kevo,Squeak(使用框架操纵Morphic组件),和其他几种编程语言采用。
1JavaScript面向对象编程命名空间命名空间是一个容器,它允许开发人员在一个独特的,特定于应用程序的名称下捆绑所有的功能。
在JavaScript中,命名空间只是另一个包含方法,属性,对象的对象。
需要认识到非常重要的一点,与其他面向对象编程语言中的普通对象和命名空间相比,它们在语言层面上没有区别。
创造的JavaScript命名空间背后的想法很简单:一个全局对象被创建,所有的变量,方法和功能成为该对象的属性。
使用命名空间也最大程度地减少应用程序的名称冲突的可能性。
我们来创建一个全局变量叫做MYAPP// 全局命名空间var MYAPP = MYAPP ||{};在上面的代码示例中,我们首先检查MYAPP是否已经被定义(是否在同一文件中或在另一文件)。
如果是的话,那么使用现有的MYAPP全局对象,否则,创建一个名为MYAPP的空对象用来封装方法,函数,变量和对象。
我们也可以创建子命名空间:// 子命名空间MYAPP.event ={};下面是用于创建命名空间和添加变量,函数和方法的代码写法:// 给普通方法和属性创建一个叫做monMethod的容器monMethod ={regExForName:"", // 定义名字的正则验证regExForPhone:"", // 定义电话的正则验证validateName:function(name){// 对名字name做些操作,你可以通过使用“this.regExForname”// 访问regExForName变量},validatePhoneNo:function(phoneNo){// 对电话号码做操作}}// 对象和方法一起申明MYAPP.event ={addListener:function(el, type, fn){// 代码},removeListener:function(el, type, fn){// 代码},getEvent:function(e){// 代码}// 还可以添加其他的属性和方法}//使用addListner方法的写法:MYAPP.event.addListener("yourel","type", callback);标准内置对象JavaScript有包括在其核心的几个对象,例如,Math,Object,Array和String对象。
下面的例子演示了如何使用Math对象使用其随机()方法来获得一个随机数。
console.log(Math.random());注意:T这里和接下来的例子都假设名为console.log的方法全局有定义。
console.log实际上不是JavaScript 自带的。
查看JavaScript 参考:全局对象了解JavaScript 内置对象的列表。
JavaScript 中的每个对象都是Object对象的实例且继承它所有的属性和方法。
自定义对象类JavaScript是一种基于原型的语言,它没类的声明语句,比如C+ +或Java中用的。
这有时会对习惯使用有类申明语句语言的程序员产生困扰。
相反,JavaScript可用方法作类。
定义一个类跟定义一个函数一样简单。
在下面的例子中,我们定义了一个新类Person。
function Person(){}// 或var Person =function(){}对象(类的实例)我们使用new obj 创建对象obj的新实例, 将结果(obj 类型)赋值给一个变量方便稍后调用。
在下面的示例中,我们定义了一个名为Person的类,然后我们创建了两个Person的实例(person1 and person2).function Person(){}var person1 =new Person();var person2 =new Person();有两种为对象创建实例,请参考Object.create。
构造器在实例化时构造器被调用(也就是对象实例被创建时)。
构造器是对象中的一个方法。
在JavaScript,中函数就可以作为构造器使用,因此不需要特别地定义一个构造器方法. 每个声明的函数都可以在实例化后被调用执行构造器常用于给对象的属性赋值或者为调用函数做准备。
在本文的后面描述了类中方法既可以在定义时添加,也可以在使用前添加。
在下面的示例中, Person类实例化时构造器调用一个 alert函数。
function Person(){alert('Person instantiated');}var person1 =new Person();var person2 =new Person();属性(对象属性)属性就是类中包含的变量;每一个对象实例有若干个属性. 为了正确的继承,属性应该被定义在类的原型属性(函数)中。
可以使用关键字this调用类中的属性, this是对当前对象的引用。
从外部存取(读/写)其属性的语法是: InstanceName.Property; 这与C++,Java或者许多其他语言中的语法是一样的(在类中语法this.Property常用于set和get属性值)在下面的示例中,我们为定义Person类定义了一个属性firstName并在实例化时赋初值。
function Person(firstName){this.firstName = firstName;alert('Person instantiated');}var person1 =new Person('Alice');var person2 =new Person('Bob');// Show the firstName properties of the objects alert('person1 is '+ person1.firstName); // alerts "person1 is Alice"alert('person2 is '+ person2.firstName); // alerts "person2 is Bob"方法方法与属性很相似,不同的是:一个是函数,另一个可以被定义为函数。
调用方法很像存取一个属性, 不同的是add ()在方法名后面很可能带着参数. 为定义一个方法, 需要将一个函数赋值给类的prototype属性; 这个赋值给函数的名称就是用来给对象在外部调用它使用的。
在下面的示例中,我们给Person类定义了方法sayHello(),并调用了它.function Person(firstName){this.firstName = firstName;}Person.prototype.sayHello =function(){alert("Hello, I'm "+this.firstName);};var person1 =new Person("Alice");var person2 =new Person("Bob");// call the Person sayHello method.person1.sayHello(); // alerts "Hello, I'm Alice"person2.sayHello(); // alerts "Hello, I'm Bob"在JavaScript中方法通常是一个绑定到对象中的普通函数, 这意味着方法可以在其所在context之外被调用。