JavaScript面向对象程序设计中对象的定义和继承详解


Posted in Javascript onJuly 29, 2019

本文实例讲述了JavaScript面向对象程序设计中对象的定义和继承。分享给大家供大家参考,具体如下:

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

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

(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);
}
};

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

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

在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();

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); //北京, 上海, 香港

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
ExtJS 设置级联菜单的默认值
Jun 13 Javascript
js substr、substring和slice使用说明小记
Sep 15 Javascript
jQuery插件-jRating评分插件源码分析及使用方法
Dec 28 Javascript
js nextSibling属性和previousSibling属性概述及使用注意
Feb 16 Javascript
js保留两位小数使用toFixed实现
Jul 29 Javascript
JavaScript中对循环语句的优化技巧深入探讨
Jun 06 Javascript
浅谈javascript中call()、apply()、bind()的用法
Apr 20 Javascript
javascript判断数组内是否重复的方法
Apr 21 Javascript
在JavaScript中处理字符串之fontcolor()方法的使用
Jun 08 Javascript
bootstrap-treeview实现多级树形菜单 后台JSON格式如何组织?
Jul 26 Javascript
vue点击按钮动态创建与删除组件功能
Dec 29 Javascript
JS实现九宫格拼图游戏
Jun 28 Javascript
js实现多张图片每隔一秒切换一张图片
Jul 29 #Javascript
javascript面向对象程序设计实践常用知识点总结
Jul 29 #Javascript
javascript中this的用法实践分析
Jul 29 #Javascript
学习LayUI时自研的表单参数校验框架案例分析
Jul 29 #Javascript
jquery.pager.js分页实现详解
Jul 29 #jQuery
javascript面向对象创建对象的方式小结
Jul 29 #Javascript
jquery.pager.js实现分页效果
Jul 29 #jQuery
You might like
PHP 和 MySQL 开发的 8 个技巧
2007/01/02 PHP
PHP 中dirname(_file_)讲解
2007/03/18 PHP
php adodb连接不同数据库
2009/03/19 PHP
phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
2011/08/18 PHP
用 Composer构建自己的 PHP 框架之设计 MVC
2014/10/30 PHP
PHP中的traits实现代码复用使用实例
2015/05/13 PHP
Symfony模板的快捷变量用法实例
2016/03/17 PHP
基于jquery的二级联动菜单实现代码
2011/04/25 Javascript
用JSON做数据传输格式中的一些问题总结
2011/12/21 Javascript
浅析Node.js 中 Stream API 的使用
2015/10/23 Javascript
JavaScript常用基础知识强化学习
2015/12/09 Javascript
Node.js学习入门
2017/01/03 Javascript
正则验证小数点后面只能有两位数的方法
2017/02/28 Javascript
在Vue组件化中利用axios处理ajax请求的使用方法
2017/08/25 Javascript
利用JS判断客户端类型你应该知道的四种方法
2017/12/22 Javascript
vue中element 上传功能的实现思路
2018/07/06 Javascript
详解Angular中通过$location获取地址栏的参数
2018/08/02 Javascript
js中位运算的运用实例分析
2018/12/11 Javascript
ES6 迭代器与可迭代对象的实现
2019/02/11 Javascript
node.js实现微信开发之获取用户授权
2019/03/18 Javascript
[05:08]2014DOTA2国际邀请赛 Hao专访复仇的胜利很爽
2014/07/15 DOTA
Python Socket编程入门教程
2014/07/11 Python
用Python实现一个简单的能够上传下载的HTTP服务器
2015/05/05 Python
python获取外网ip地址的方法总结
2015/07/02 Python
Python3爬虫之urllib携带cookie爬取网页的方法
2018/12/28 Python
Python函数中参数是传递值还是引用详解
2019/07/02 Python
python将字典列表导出为Excel文件的方法
2019/09/02 Python
python实现监控阿里云账户余额功能
2019/12/16 Python
在Tensorflow中实现leakyRelu操作详解(高效)
2020/06/30 Python
基于PyInstaller各参数的含义说明
2021/03/04 Python
世界上最具创新性的增强型知名运动品牌:Proviz
2018/04/03 全球购物
复核员上岗演讲稿
2014/01/05 职场文书
大二学生职业生涯规划书
2014/02/05 职场文书
学校趣味运动会开幕词
2016/03/04 职场文书
python自然语言处理之字典树知识总结
2021/04/25 Python
Springboot如何同时装配两个相同类型数据库
2021/11/17 Java/Android