本文实例讲述了JavaScript面向对象程序设计中对象的定义和继承。分享给大家供大家参考,具体如下:
在面向对象的Javascript编程中,希望代码优雅有高效是非常重要的。javascript中不存在类的概念,只有对象。要想把Javascript代码写的像java 或者C++一样优雅,就得考虑如何去实现,同时也要考虑性能和高效。定义javascript对象的方式有很多,继承的方式也很多。通过不断地实践,推荐如下的方法:
(1)通过构造函数方式定义对象的所有非函数属性
(2)用原型方式定义对象的函数属性
采用这种方式,所有的属性都是单一对象私有的,而方法则是所有对象公有的,对象之间的属性不相互干扰,各个对象间共享同一个方法。
//使用原型+构造函数方式来定义对象 //构造函数定义对象的非函数属性<strong> 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); } };
在JavaScript中最好的方式就是用混合方式实现对象间的继承。和定义对象一样,我们可以将属性和方法用不同的方式定义,用call或apply方式定义继承对象的属性,利用原型链的方式实现方法的继承。如下代码所示:
//使用混合的方式实现对象的继承 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();
所谓"深拷贝",就是能够实现真正意义上的数组和对象的拷贝。它的实现并不难,只要递归调用"浅拷贝"就行了。
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); //北京, 上海, 香港
感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.jb51.net/code/HtmlJsRun测试上述代码运行效果。
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》
希望本文所述对大家JavaScript程序设计有所帮助。
JavaScript的继承(实现继承) 原型链 用 原型链 作为实现继承的方法,其基本思想是 利用原型让 一个引用类型 继承 另一个引用类型 的 属性和方法,实现方式就是让 原型对象 等于 另一个类型的实例对象。 回顾构造函数、原型对象和实例之间的关系: 每个构造函数都有个原型属性(prototype),原型属性是一个指针,指向构造函数的原型对象,原型对象默认有个构造属性(constructor
原型继承 类与实例 类的声明 生成实例 类与继承 如何实现继承 继承的几种方式 类的声明 类声明 构造函数 function Animal1() { this.name = 'animal'; } ES6中class的声明 class Animal2 { constructor() { this.name = 'animal'; } } 1.构造函数方式进行继承 functio
第六章 继承和面向对象设计 很多人认为,继承是面向对象程序设计的全部。这个观点是否正确还有待争论,但本书其它章节的条款数量足以证明,在进行高效的C++程序设计时,还有更多的工具听你调遣,而不仅仅是简单地让一个类从另一个类继承。 然而,设计和实现类的层次结构与C语言中的一切都有着根本的不同。只有在继承和面向对象设计领域,你才最有可能从根本上重新思考软件系统构造的方法。另外,C++提供了多种很令人困惑
理解对象 任何事物都可以看作对象,对象就是五级无序名/值对的集合。对象有属性和方法。 对象就是 无序属性 的集合,属性可包括基本值、对象和函数,简单地说就是一组无特定顺序的值,由名/值对组成,值可以是数据或函数。属性名是字符串,我们也将对象看成是从字符串到值的映射,当然,对象除了本身的属性外,还可以从一个叫原型的对象继承属性。 在JavaScript中,除了字符串、数字、true、false、nu
面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过 继承 机制。继承完全可以理解成类之间的 类型和子类型 关系。 假设你想要写一个程序来记录学校之中的教师和学生情况。他们有一些共同属性,比如姓名、年龄和地址。他们也有专有的属性,比如教师的薪水、课程和假期,学生的成绩和学费。 你可以为教师和学生建立两个独立的类来处理它们,但是这样做的话,如果要增加一个新的共有属性,就意味着要
本文向大家介绍浅谈JavaScript面向对象--继承,包括了浅谈JavaScript面向对象--继承的使用技巧和注意事项,需要的朋友参考一下 一、继承的概念 子类共享父类的数据和方法的行为,就叫继承。 二、E55如何实现继承?探索JavaScript继承的本质 2.1构造函数之间的“复制粘贴” 第一条路是通过构造函数来继承,这可以理解为子类直接复制了父类构造函数的代码,然后按照一定的规矩“粘贴”