源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

JavaScript面向对象编程入门教程

  • 时间:2022-12-30 11:54 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:JavaScript面向对象编程入门教程
尽管面向对象JavaScript与其他语言相比之下存在差异,并由此引发了一些争论,但毋庸置疑,JavaScript具有强大的面向对象编程能力 本文先从介绍面向对象编程开始,然后回顾JavaScript对象模型,最后演示JavaScript中的面向对象编程概念。 [b]JavaScript回顾[/b] 如果你对诸如变量(variables)、类型(types)、函数(functions)、以及作用域(scope)等JavaScript概念觉得心里没底,那么你可以阅读重新介绍JavaScript中的这些主题。你还可以查阅[url=https://developer.mozilla.org/en/JavaScript/Guide]JavaScript 1.5核心指南 [/url] [b]面向对象编程[/b] 面向对象编程是一种编程范式(paradigm),即使用抽象来创建基于真实世界的模型。它使用了几种以前建立的范式技术,包括模块化(modularity)、多态(polymorphism)、和封装(encapsulation)。今天,许多流行的编程语言(比如Java、JavaScript、C#、C++、Python、PHP、Ruby、以及Objective-C)都支持面向对象编程(OOP)。 面向对象编程可视为使用协作对象集合来进行软件设计,这与传统观点相反,传统观点把程序视为函数集合,或者简化为计算机指令列表。在面向对象编程中,每个对象都具有以下能力:接收消息、处理数据、以及给其他对象发送消息。每个对象都可以视为一个独立的具有不同角色或责任的小机器。 面向对象编程旨在为编程提升更大的灵活性和可维护性,并在大规模软件工程中广泛流行。由于其非常重视模块化,因此面向对象代码旨在让开发更简单、稍后理解起来更容易,而且相对于较少采用模块化的编程方法,使得对于复杂情况及步骤的分析、编码和理解更加直接。 [b]专用术语[/b] [b]类(Class) [/b]~ 定义对象的特征(characteristics)。 [b]对象(Object) [/b]~ 类的实例(Instance)。 [b]属性(Property) [/b]~ 某一对象特征(characteristic),例如颜色。 [b]方法(Method) [/b]~ 某种对象能力,例如行走。 [b]构造函数(Constructor) [/b]~ 实例化(instantiation)时所调用的方法。 [b]继承(Inheritance) [/b]~ 一个类可以继承来自另一个类的特征。 [b]封装(Encapsulation) [/b]~ 一个类只定义该对象的特征,一个方法只定义该方法如何执行。 [b]抽象(Abstraction) [/b]~ 将某一对象的复杂继承、方法、属性结合在一起,而且必须能够模拟某一现实模型。 [b]多态(Polymorphism)[/b] ~ 不同类可能会定义相同的方法或属性。 对于面向对象编程的进一步描述,参阅维基百科的面向对象编程词条。 [b]基于原型的编程[/b] 基于原型的编程(Prototype-based programming)是一种面向对象编程风格,其中类(classes)并不存在,并且行为重用(在基于类的语言中称为继承)是通过粉饰充当原型的现存对象来完成的。这种模式也称为无类的(class-less)、面向原型的(prototype-oriented)、或基于实例(instance-based)的编程。 关于基于原型语言的最初(且非常规范的)示例就是由David Ungar和Randall Smith开发的Self编程语言。然而,这种无类编程风格最近越来越受欢迎,并且已被一些编程语言采用,例如avaScript、Cecil、NewtonScript、Io、MOO、REBOL、Kevo、Squeak(当使用Viewer框架来操纵Morphic组件时)、及其他几种语言。 [b]JavaScript面向对象编程[/b] [b]核心对象(Core Objects)[/b] JavaScript有几个包含在其核心中的对象;例如,Math、Object、Array、以及String等对象。下面的示例演示了如何使用Math对象的random()方法获取随机数。
[url=https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Global_Objects]JavaScript 1.5核心参考:全局对象(Global Objects)。 [/url] JavaScript中的每个对象都是一个Object对象的实例,并因此继承其所有属性和方法。 [b]自定义对象(Custom Objects)[/b] [b]类(The Class) [/b] JavaScript是基于原型的语言,其中不包含可在如 C++或Java中找到的类声明(class statement)。有时这会让一些习惯于具有类声明语言(languages with a class statement)的程序员感到困惑。不过,JavaScript用函数(functions)作为类。定义一个类简单到就是定义一个函数。在下例中,我们定义了名为Person(人)的新类。
[url=https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create]Object.create[/url]。 [b]构造函数(The Constructor)[/b] 当实例化时(创建对象实例的瞬间)是会调用构造函数。构造函数是类的一个方法。而在JavaScript中,会函数(function)作为作为该对象的构造函数;因此,也就无需显式定义一个构造函数方法。类中声明的每个行为在实例化时都会执行。 构造函数用于设置对象属性或调用方法为使用该对象做准备。本文稍后会介绍,通过使用一种不同的语法来添加类方法及其定义 。 在下例中,当实例化Person时,Person类的构造函数会显示一个警告框。
[url=https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call]Function.call[/url]和[url=https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply]Function.apply[/url] [b]继承(Inheritance)[/b] 继承是一种方法,用于创建作为一个或多个类专用版本的类。(JavaScript仅支持单类继承)。这个专用类通常被称为子类(child),而其他类通常被称为父类(parent)。在JavaScript中,你要完成继承,需将父类的实例赋给子类,然后将子类特化(specializing)。 提示:由于JavaScript不检测的子类的prototype.constructor(原型的构造函数),参阅[url=https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Object/prototype]Core JavaScript 1.5核心参考:Global Objects:Object:prototype[/url]属性,因此我们必须手动指定该值。 在下例中,我们定义Student类作为Person的子类。然后我们重新定义sayHello()方法,并添加sayGoodBye()方法。
[u]复制代码[/u] 代码如下:
// 定义Person类 function Person() {} Person.prototype.walk = function() {     alert('I am walking!'); }; Person.prototype.sayHello = function() {     alert('hello'); }; // 定义Student类 function Student() {     //调用父类构造函数     Person.call(this); } // 继承Person Student.prototype = new Person(); // 修正构造函数指针,由于它指向Person Student.prototype.constructor = Student; // 替换sayHello方法 Student.prototype.sayHello = function() {     alert('hi, I am a student'); } // 添加sayGoodBye方法 Student.prototype.sayGoodBye = function() {     alert('goodBye'); } var student1 = new Student(); student1.sayHello(); student1.walk(); student1.sayGoodBye(); // 检验继承 alert(student1 instanceof Person); // true alert(student1 instanceof Student); // true
[b]封装[/b] 在上例中,Student无须知晓Person类的walk()方法是如何实现的,但仍可使用该方法;Student类无须显式定义该方法,除非我们想改变它。这称为封装(encapsulation),这样每个类继承其父类的方法,并且只需定义它所希望改变的东西。 [b]抽象[/b] 抽象是一种机制(mechanism),允许对处理中的问题的当前部分进行建模。这可以通过继承(特化)或组合(composition)来实现。JavaScript通过继承实现特化(specialization),通过让类实例成为其他对象的属性值实现组合。 JavaScript的Function类继承自Object类(这说明模型的特化),并且Function.prototype属性是Object的实例(这说明了组合)。
[u]复制代码[/u] 代码如下:
var foo = function() {}; alert('foo is a Function: ' + (foo instanceof Function)); alert('foo.prototype is an Object: ' + (foo.prototype instanceof Object));
[b]多态[/b] 就像所有的方法和属性被定义在原型属性内部一样,不同的类可以定义具有相同名称的方法;方法的作用域限于定义它们的类之内。这仅当两个类之间没有父子关系(当一个类没有从继承链中的其他类继承时)时才为真。 [b]提示[/b] 本文中所提出的面向对象编程实现技术不仅适用于JavaScript,因为就如何进行面向对象编程而言,这是非常灵活的。 同样,这里展示的技术既没有使用任何语言技巧(language hacks),也没有模仿其他语言的对象理论实现。 在JavaScript中,还有其他更高级的面向对象编程的技术,但是那些内容已超出了这篇介绍性文章的范围。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部