`

Javascript面向对象定义和继承最佳实践

 
阅读更多

在面向对象的Javascript编程中,希望代码优雅有高效是非常重要的。javascript中不存在类的概念,只有对象。要想把Javascript代码写的像java 或者C++一样优雅,就得考虑如何去实现,同时也要考虑性能和高效。定义javascript对象的方式有很多,继承的方式也很多。通过不断地实践,推荐如下的方法:

1.Javascript对象的定义采用混合方式【构造函数 +原型方式(prototype)】

1)通过构造函数方式定义对象的所有非函数属性

2)用原型方式定义对象的函数属性

 

采用这种方式,所有的属性都是单一对象私有的,而方法则是所有对象公有的,对象之间的属性不相互干扰,各个对象间共享同一个方法。

 

//使用原型+构造函数方式来定义对象
//构造函数定义对象的非函数属性
function Person()
{
        this.username = new Array();
        this.password = "123";
}

//通过原型方式定义对象的函数
Person.prototype.getInfo = function()
{
        alert(this.username+","+this.password);
};

var p = new Person();
var p2 = new Person();
p.username.push("zhangsan");
p2.username.push("lisi");
p.getInfo();
p2.getInfo();

 在现实的开发过程中,我们可能希望开发的各个类(实质是对象)能像java程序中放到一个包中统一管理,统一使用,而各个对象相互独立,同时避免对象重名等等因素,我们需要给每个类有个作用域,此时我们采用将对象放到自定匿名函数的方式来解决,这一点和jQuery开发插件的有点类似。代码如下:

 

 

/**
 * @author jasson
 * @include common.js
 */
 
//对象存在就等于对象,对象不存在就创建{}
var JassonChart = JassonChart || {};
(function(){
	//构造函数定义对象的非函数属性
	function Person()
	{
		this.username = new Array();
		this.password = "123";
	}
	
	//通过原型方式定义对象的函数
	Person.prototype.getInfo = function()
	{
			alert(this.username+","+this.password);
	};
	//将该类放到JassonChart中,类似java中的包,或者C++中的
	JassonChart.Person= Person;
}());
//调用该类库中的Person类
var p = new JassonChart.Person();

      这样我们可以定义多个类,每个类都采用如上的方式实现,这样各个类相互都有作用域,非常规范。对于我们要用到的一些工具类,我们可以采用简单的对象进行定义,代码如下

/** 
* @author jasson 
*/ 
var JassonChart = JassonChart || {}; 

JassonChart .util = { 
constants : { 
WIDTH : 'width', 
HEIGHT : 'height', 
SVG : 'SVG', 
CANVAS : 'CANVAS', 
G : 'G', //svg element 
STRING : 'string' 
}, 
distance : function(a, b) { 
var dx = a.x - b.x; 
var dy = a.y - b.y; 
return Math.sqrt(dx * dx + dy * dy); 
}
}; 

 2.Javascript对象的继承采用如下几种方式

2.1 Javascript对象的继承采用混合方式【构造函数 +原型方式(prototype)】

JavaScript中最好的方式就是用混合方式实现对象间的继承。和定义对象一样,我们可以将属性和方法用不同的方式定义,用callapply方式定义继承对象的属性,利用原型链的方式实现方法的继承。如下代码所示:

//使用混合的方式实现对象的继承 
function Parent(hello) 
{ 
	this.hello = hello;//定义父类的属性 
} 
Parent.prototype.sayHello = function()//定义父类的方法 
{ 
	alert(this.hello); 
} 
function Child(hello,world) 
{ 
	Parent.call(this,hello);//继承父类的属性 
	//or Parent.apply(this,arguments);//继承父类的属性 
	this.world = world; 
} 
Child.prototype = new Parent();//继承父类的方法 
Child.prototype.sayWorld = function() 
{ 
	alert(this.world); 
} 
var child = new Child("hello","world"); 
child.sayHello(); 
child.sayWorld(); 

 2.2 深度拷贝方法

所谓"深拷贝",就是能够实现真正意义上的数组和对象的拷贝。它的实现并不难,只要递归调用"浅拷贝"就行了。

function deepCopy(p, c) { 
	var c = c || {};
	for (var i in p) { 
	if (typeof p[i] === 'object') { 
		c[i] = (p[i].constructor === Array) ? [] : {};
deepCopy(p[i], c[i]);
} else {
c[i] = p[i];
}
}
return c;
}

 使用的时候这样写:

var Doctor = deepCopy(Chinese);

现在,给父对象加一个属性,值为数组。然后,在子对象上修改这个属性:

Chinese.birthPlaces = ['北京','上海','香港'];

Doctor.birthPlaces.push('厦门');

这时,父对象就不会受到影响了。

alert(Doctor.birthPlaces); //北京, 上海, 香港, 厦门

alert(Chinese.birthPlaces); //北京, 上海, 香港

目前,jQuery库使用的就是这种继承方法。

 

 

 

分享到:
评论

相关推荐

    面向对象JavaScript精要(英文原版pdf)

    ### 面向对象JavaScript精要 #### 一、书籍概览 本书《面向对象JavaScript精要》由Nicholas C. Zakas编写,是面向对象编程领域中的权威指南之一,尤其针对JavaScript这门语言。作者深入浅出地介绍了面向对象编程的...

    学习javascript面向对象 javascript实现继承的方式

    以上六种继承方式在JavaScript面向对象编程中各有用途,开发者可以根据具体需求选择最适合的继承方式。需要注意的是,虽然继承可以使代码复用性更高,但过度的继承层次和复杂的继承关系可能会导致代码难以理解与维护...

    JavaScript面向对象编程指南(第2版).rar

    JavaScript是一种广泛...通过深入学习这本《JavaScript面向对象编程指南(第2版)》,开发者不仅能掌握JavaScript的面向对象编程基础,还能了解到实际项目中如何有效地运用这些知识,提升编程技巧和解决问题的能力。

    Javascript 面向对象的JavaScript进阶

    ### JavaScript面向对象进阶知识点详解 #### 8.1 面向对象编程的基本特性 在探讨面向对象的JavaScript之前,我们首先需要了解面向对象编程(Object-Oriented Programming, OOP)的基本特性:封装性、抽象性、继承...

    JavaScript面向对象编程指南.pdf

    JavaScript面向对象编程是指在JavaScript语言中使用面向对象的方法来编写程序。JavaScript是一种高级的、解释型的编程语言,它支持面向对象的编程范式,允许开发者创建对象、使用继承和多态等面向对象的特性。以下是...

    JavaScript面向对象编程指南 pdf

    JavaScript是一种广泛应用于Web开发的脚本语言,..."JavaScript面向对象编程指南"这本书应该是对这一主题的详细解析,包括概念讲解、实例演示以及最佳实践,对于想要提升JavaScript编程能力的人来说是一份宝贵的资源。

    JavaScript面向对象精要(英文版)

    ### JavaScript面向对象精要 #### 一、概述 《JavaScript面向对象精要》是一本深入讲解JavaScript面向对象编程原理的专业书籍。本书由知名的前端开发者Nicholas C. Zakas撰写,全面介绍了JavaScript作为一种动态...

    JavaScript面向对象编程指南

    JavaScript是一种广泛应用于Web开发的动态编程语言,尤其在构建交互式网页和富互联网应用...《JavaScript面向对象编程指南》这本书将帮助你进一步探索这个主题,通过实例和详细的解释,提升你的JavaScript编程技能。

    面向对象JavaScript开发

    4. **继承**:JavaScript支持多种继承方式,如原型链继承、构造函数继承、组合继承、原型式继承、寄生式继承和寄生组合式继承等。其中,最常用的可能是原型链继承,通过设置`prototype`指向另一个对象来实现。 ```...

    javascript面向对象编程(中文).pdf

    ### JavaScript面向对象编程知识点概述 #### 一、现代JavaScript编程概览 - **JavaScript的演进**:自诞生以来,JavaScript经历了从一个简单的脚本语言到现今被广泛应用于构建复杂应用的强大编程语言的过程。它的...

    JavaScript 面向对象编程详细讲解文档

    JavaScript的核心在于对象、原型和隐式继承,这些都是理解其面向对象特性的重要概念。 首先,让我们深入理解对象。在JavaScript中,一切皆为对象,包括函数。你可以直接通过对象字面量或者构造函数来创建对象。对象...

    javascript面向对象

    ### JavaScript面向对象编程详解 #### 引言 在软件工程领域,面向对象编程(OOP)是一种编程范式,它使用“对象”来设计软件。每个对象都可以包含数据(属性)和方法(行为)。JavaScript虽然起初并非为面向对象...

    javascript面向对象框架

    "javascript面向对象框架"这一主题涵盖了JavaScript中实现面向对象编程的框架,特别是Prototype和MooTools这两个优秀的库。 Prototype是JavaScript的一个开源库,它扩展了JavaScript的基本对象和函数,提供了强大的...

    JavaScript面向对象编程案例

    JavaScript是一种广泛应用于Web开发的脚本语言,尤其在构建交互式网页和动态应用程序时不可或...通过阅读和实践这些案例,你可以逐步掌握如何创建、继承和操作JavaScript对象,从而成为一名更出色的JavaScript开发者。

    Javascript面向对象编程

    ### JavaScript面向对象编程详解 #### 一、引言 JavaScript作为一种广泛使用的脚本语言,在Web开发领域占据着举足轻重的地位。尽管JavaScript本质上是一种基于原型的语言,但它也支持面向对象编程的一些特性,使得...

    JavaScript面向对象基础.ppt

    面向对象编程的基础包括类、对象、继承和多态等概念。类是对象的模板或蓝图,定义了一组属性(数据成员)和方法(函数)。对象则是类的实例,具备类所定义的属性和行为。JavaScript虽然没有传统的类定义,但可以通过...

    javascript 经典面向对象设计

    《Object-Oriented JavaScript》这本书不仅深入介绍了面向对象编程的基础理论,还提供了大量的实际代码示例和最佳实践指导。对于希望提高JavaScript开发技能、编写出高质量、可扩展和可重用代码的开发者来说,这本书...

    基于闭包的JavaScript面向对象编程框架.pdf

    3. 基于闭包的JavaScript面向对象编程框架可以实现类的定义、继承和多态特征。 4. 闭包可以用来指定类的名称、父类、类的静态私有成员和公共成员。 5. 闭包可以用来实现继承,并指定子类和父类之间的关系。 6. 闭包...

Global site tag (gtag.js) - Google Analytics