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 相关文章推荐
关于Aptana Studio生成自动备份文件的解决办法
Dec 23 Javascript
JavaScript onkeydown事件入门实例(键盘某个按键被按下)
Oct 17 Javascript
js针对ip地址、子网掩码、网关的逻辑性判断
Jan 06 Javascript
js利用正则表达式检验输入内容是否为网址
Jul 05 Javascript
javascript十六进制数字和ASCII字符之间的转换方法
Dec 27 Javascript
AngularJS ui-router (嵌套路由)实例
Mar 10 Javascript
vue数据双向绑定的注意点
Jun 23 Javascript
详解webpack+gulp实现自动构建部署
Jun 29 Javascript
vue 封装自定义组件之tabal列表编辑单元格组件实例代码
Sep 07 Javascript
Vue2.0实现调用摄像头进行拍照功能 exif.js实现图片上传功能
Apr 28 Javascript
mockjs+vue页面直接展示数据的方法
Dec 19 Javascript
Node.JS发送http请求批量检查文件中的网页地址、服务是否有效可用
Nov 20 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从右向左/从左向右截取字符串的实现方法
2011/11/28 PHP
php实现的Curl封装类Curl.class.php用法实例分析
2015/09/25 PHP
thinkPHP中分页用法实例分析
2015/12/26 PHP
解决Laravel自定义类引入和命名空间的问题
2019/10/15 PHP
克隆javascript对象的三个方法小结
2011/01/12 Javascript
关于window.pageYOffset和document.documentElement.scrollTop
2011/04/05 Javascript
JQuery选择器特辑 详细小结
2012/05/14 Javascript
js获取当前日期代码适用于网页头部
2013/06/27 Javascript
Js日期选择自动填充到输入框(界面漂亮兼容火狐)
2013/08/02 Javascript
jQuery实现鼠标经过弹出提示信息的地图热点效果
2015/08/07 Javascript
js实现表单Radio切换效果的方法
2015/08/17 Javascript
AngularJS身份验证的方法
2016/02/17 Javascript
js中数组结合字符串实现查找(屏蔽广告判断url等)
2016/03/30 Javascript
微信小程序 Canvas增强组件实例详解及源码分享
2017/01/04 Javascript
Vue.js实现实例搜索应用功能详细代码
2017/08/24 Javascript
VueJS事件处理器v-on的使用方法
2017/09/27 Javascript
关于ES6箭头函数中的this问题
2018/02/27 Javascript
解决低版本的浏览器不支持es6的import问题
2018/03/09 Javascript
vuejs+element UI点击编辑表格某一行时获取内容填入表单的示例
2018/10/31 Javascript
微信小程序使用map组件实现检索(定位位置)周边的POI功能示例
2019/01/23 Javascript
基于JavaScript实现控制下拉列表
2020/05/08 Javascript
Python学习笔记(二)基础语法
2014/06/06 Python
浅析Python中的join()方法的使用
2015/05/19 Python
简单解析Django框架中的表单验证
2015/07/17 Python
设计模式中的原型模式在Python程序中的应用示例
2016/03/02 Python
Python工程师面试必备25条知识点
2018/01/17 Python
Python3实现的Mysql数据库操作封装类
2018/06/06 Python
python中多个装饰器的调用顺序详解
2019/07/16 Python
Python 50行爬虫抓取并处理图灵书目过程详解
2019/09/20 Python
Python多线程实现支付模拟请求过程解析
2020/04/21 Python
如何使用pycharm连接Databricks的步骤详解
2020/09/23 Python
美国知名的网上鞋类及相关服装零售商:Shoes.com
2017/05/06 全球购物
高级电工工作职责
2013/11/21 职场文书
人事经理岗位职责范本
2014/08/04 职场文书
银行党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
农贸批发市场管理制度
2015/08/07 职场文书