虽然面向对象Javascript不同于其他语言,但它引发了一些争论,但毫无疑问,Javascript具有强大的面向对象编程能力。

本文首先介绍了面向对象编程,然后回顾了Javascript对象模型,最后演示了Javascript中面向对象编程的概念。

Javascript的回顾

如果你不知道Javascript概念如变量(变量),类型(类型),函数(函数),和范围(范围),你可以阅读和重新引入这些主题在Javascript中。你也可以看看Javascript 1.5核心指南

面向对象的程序设计

面向对象编程是一种编程范式(范式),使用抽象来创造一个真正的World为基础的模型,它使用几个先前建立的范式的技术,包括模块化、多态和封装。今天,许多流行的编程语言,如java,Javascript,C #,C++,Python,PHP,露比和Objective-C语言,支持面向对象编程(OOP)。

面向对象编程是一种与传统视图相反的协同对象集合设计方法。传统的观点认为,程序的功能设置,或将其简化为计算机指令列表。面向对象程序设计中,每个对象都具有以下功能:接收消息,处理数据,并发送消息给其他对象,每个对象都可以看作是不同角色和责任的独立机。
面向对象的程序设计来提高编程的灵活性和可维护性,在大型软件工程中得到广泛的流行,因为它非常注重模块化,面向对象的代码的目的是使开发更简单,更容易理解后,和相对较少的模块化编程方法使它更直接的分析、编码和复杂的实际情况步骤的理解。

特别条款

类(类)
定义对象的特性(特性)。
对象(对象)
类~(实例)的一个例子。
财产(财产)
物体(特性)的特征,如颜色。
方法(方法)
物体某一物体的能力,如行走。
构造函数(构造函数)
实例化(实例化)时调用的方法。
继承(继承)
一个类可以继承另一个类的特性。
封装(封装)
类只定义对象的特性,而方法只定义方法的执行方式。
抽象(抽象)
必须合并某个对象的复杂继承、方法和属性,并且它必须能够模拟一个真实的模型。
多态性(多态性)
不同的类可以定义相同的方法或属性。
为进一步描述面向对象编程,面向对象编程条目指的是维基百科。

基于原型的编程

基于原型的编程是一种面向对象的编程风格,其中的类(类)是不存在的,和行为的复用(基于类的语言称为继承)是以粉饰现有对象,原型完成。这种模式也被称为类少,面向原型,或基于实例的编程。
原来的(和非常规范)的原型基于实例的语言是由David Ungar和Randall Smith开发的自动编程语言。然而,这种方式已经越来越流行,并已在一些编程语言,如avascript,塞西尔,newtonscript,IO,哞,REBOL、Kevo、吱(当使用浏览器框架操纵形态成分),和一些其他的语言。

面向对象编程

核心对象(核心对象)

Javascript在其核心中有几个对象;例如,对象,如数学、对象、数组和字符串。下面的示例演示如何使用数学对象的随机()方法获取随机数。

复制代码代码如下所示:
警报(Math.random());

提示:本例和所有其他示例假定函数名称警报已在全局范围(如Web浏览器中的警报中)中定义。警报功能实际上不是Javascript本身的一部分。

Javascript核心对象列表,请参阅Javascript 1.5核心参考:全局对象(全局对象)。

Javascript中的每个对象都是对象对象的实例,因此继承了它的所有属性和方法。

自定义对象(自定义对象)

类(类)

Javascript是一种基于原型的语言,它不包含类声明可以在C++和java发现(类声明)。有时这会混淆一些程序员是一个类声明的语言。然而,Javascript的使用功能(函数)作为一类一类的定义。简单地定义一个函数。在下面的例子中,我们定义了一类新命名的人(人)。
复制代码如下:功能人(){ }

对象(类实例)(对象(类实例))

创建obj对象的新实例,我们使用声明新的obj,分配结果(其类型是obj)一个变量(变量)进行访问。
在下面的例子中,我们首先定义类命名的人,然后创建两个实例(甲和2)。
复制代码如下:函数(人){ }
VaR甲=新的人();
var 2 =新的人();

新实例的选择,object.create,也可以指。

构造函数(构造函数)

构造函数在实例化时调用(创建对象实例的时刻)。构造函数是类的方法。在Javascript中,函数(函数)被用作对象的构造函数,因此,没有一个构造函数方法的明确定义。

构造函数用于设置对象属性或调用方法来准备要使用的对象。

在下一个示例中,当该实例被实例化时,该类的构造函数将显示一个警告框。

复制代码代码如下:功能人(){
警报('person实例化);
}
VaR甲=新的人();
var 2 =新的人();

属性(对象属性)(属性(对象属性))

属性是包含在类中的变量;每个对象实例都有这些属性。属性应该设置在类(函数)的原型属性中以继承正常工作。
在课堂上,运行性能由这个关键字来实现的,而这是指当前对象,访问一个属性(读或写)课外是以下语法:instanceName。性能;这是因为C++一样,java和其他语言。(使用这个。在类的语法属性获取或设置属性值)。

在下一个示例中,我们为类定义性别(性别)属性,然后在初始化时定义属性。
复制代码代码如下:功能人(性别){
this.gender =性别;
警报('person实例化);
}
VaR甲=新的人(凸出的); / /男性:男性
var 2 =新的人(); / /女:
甲 / /性别
警报('person1是' +甲。性别); / /甲是男性

方法(方法)

方法如下,如属性相同的逻辑;不同的是,它们的功能和定义为函数调用方法类似于访问属性,但是你加()在方法名的结束,你可能有一个参数(参数)的方法定义。为对这一类的原型属性指定一个函数。这个函数指定的名称是上调的方法的名称的对象。
在下面的例子中,我们定义和使用sayHello()为人类的方法。
复制代码代码如下:功能人(性别){
this.gender =性别;
警报('person实例化);
}
person.prototype.sayhello =函数(){
警报(你好);
};
VaR甲=新的人(凸出的);
var 2 =新的人(); / / sayHello方法调用的人。
(甲。sayHello); / /你好

在Javascript中,该方法绑定到一个类/对象的一个公共函数对象作为属性,这意味着它可以从上下文(脱离上下文)调用:
复制代码代码如下所示:
功能人(性别){
this.gender =性别;
}
person.prototype.saygender =函数(){
警戒(这一性别);
};
VaR甲=新的人(凸出的);
无功genderteller = person1.saygender;
person1.saygender(通知); / /凸出的
GenderTeller (alerts); / / undefined
警报(genderteller =甲。saygender) / /警报真实;
警报(genderteller =人。原型。saygender) / /警报真实;

这个例子演示了一个数的概念,在一个时间。这表明,没有对象的方法(每个对象的方法)在Javascript,因为所有的参考点的方法对相同的功能,那就是,我们最初定义的原型的功能。当一个函数称为方法(或者说一个属性),Javascript将当前对象的上下文(上下文对象)到一个特定的这个变量。这相当于调用方法调用的函数对象,如下图所示:
复制代码代码如下所示:
genderteller.call(甲); / / alerts'male'e

更多信息,见function.call和function.apply

继承(继承)

Inheritance is a method for creating classes that are used as a special version of one or more classes.(Javascript only supports single class inheritance).This special class is usually referred to as a subclass (child), while the other class is usually called the parent class (parent).In Javascript, you want to complete the inheritance, you need to assign an instance of the parent class to the subclass, and then the subclass is specialized (specializing).

提示:由于Javascript类prototype.constructor(原型的构造函数),没有检测到的核心,把核心Javascript 1.5核心参考:全局对象:对象:原型的属性,所以我们必须手动指定这个值。

在下面的例子中,我们定义了学生作为人类的一个子类。然后我们重新定义了sayHello()方法和加saygoodbye()方法。

复制代码代码如下所示:
类定义
函数(人){ }
person.prototype.walk =函数(){
警戒(我在走路)!;
};
person.prototype.sayhello =函数(){
警报(你好);
};
学生类定义
函数学生(){
调用父类构造函数
person.call(本);
}
人继承
student.prototype =新的(人); / /修改构造函数,因为它指向指针的人。
student.prototype.constructor =学生; / / sayHello置换法
student.prototype.sayhello =函数(){
警报(嗨,我是一个学生);
}
/ /添加saygoodbye方法
student.prototype.saygoodbye =函数(){
警报(再见);
}
VaR啦=新学生();
student1.sayhello();
student1.walk();
(学生。再见); / /测试继承
警报(学生是人); / /真的
警报(学生是学生); / /真的



封装

在这种情况下,学生不需要知道人类(步行)方法是如何实现的,但仍然可以使用这种方法;学生类不需要显式地定义方法,除非我们想改变它。这就是所谓的封装,这样每一个类都继承它父的方法,只需要定义它想要改变什么。

摘要

抽象是一种机制(机制),允许在处理当前问题的部分建模。这可以通过继承实现专业化(专业化)或composition.javascript继承的类的实例,结合其他对象的属性值。
Javascript的函数类的对象类继承(这表明模型的专业化),和function.prototype属性是对象的一个实例(显示组合)。
复制代码如下:var(富=函数){ };
警报('foo是一个功能:+(foo instanceof功能));
警报(' foo.prototype是对象:+(foo.prototype实例对象));

多态性

就像所有的方法和属性是在原型属性的定义,不同的类可以具有相同名称的定义方法;该方法的范围是有限的,定义它们的类。这是唯一真正的当有两个类之间没有亲子关系(当一个类不继承其它类的继承链)。

提示

本文提出的面向对象编程实现技术不仅适用于Javascript,而且在面向对象编程方面非常灵活。
同样,这里展示的技术既没有语言的黑客,也没有其他语言的对象理论。
Javascript中还有其他更高级的面向对象编程技术,但这些超出了本文的介绍范围。