浅谈JavaScript中面向对象技术的模拟


Posted in Javascript onSeptember 25, 2006

一、引言

在C#和Java语言中,面向对象是以类的方式实现的,特别是继承这个特性,类的方式继承表现出了强大的功能,而且也易于学习。JavaScript不是纯的面向对象的语言,而是基于对象的语言,对象的继承是以原型函数的形式继承的,很多初学者刚开始接触的时候不太理解,但是JavaScript这种以原型函数的形式实现面向对象技术,不仅是可行的,而且还为面向对象技术提供了动态继承的功能,本文主要讨论了JavaScript的面向对象技术。
二、原型对象概述

每个JavaScript对象都有原型对象,对象都继承原型对象的所有属性。一个对象的原型是由创建该对象的构造函数定义的。JavaScript的所有函数都有一个名为prototype的属性,该属性引用了原型对象,该原型对象初始化的时候只有constructor属性来引用创建该原型对象的对象。JavaScript没有Class定义类的概念,构造函数就定义了类,并初始化类中的属性,每个类的成员都会从原型对象中继承相同的属性,也就是说,原型对象提供了类的实例共享的属性和方法,这就节约了内存。

当读取一个对象的属性的时候,JavaScript会先从对象中查找,如果没有查找到,才会到原型对象中查找该属性(或方法),所以,尤其是对于方法,最好保存到原型对象中以便于共享,并且达到节省内存的目的,而且原型对象还有一个强大的功能,那就是如果通过构造函数实例化一些对象后,再给构造函数的原型对象增加属性和方法,那么它原来实例化的对象实例将会继承这些增加的属性和方法。
三、对象属性、对象方法、类属性、类方法

每个对象都会有自己单独的实例属性和实例方法的副本,如果实例化5个对象,那么就会有5个对象的实例属性和实例方法副本。This关键字引用它们的实例对象,也就是说,谁操作了实例方法,this就引用谁;访问了哪个实例对象的属性,this就引用这个实例对象。

类方法和类属性只有一个副本,类方法调用的时候必须引用类的名字,例如:Date.setHours();

下面用一个程序来表现实例属性、实例方法、类属性、类方法

 function Mobile(kind,brand) { 
    this.kind=kind;//定义手机的种类,例如GSM/CDMA 

    this.brand=brand;//定义手机的品牌,this关键字表示用该构造函数实例化之后的对象 

} 

 

/**//* 

 定义类的第二步是在构造函数的原型对象中定义它的实例方法或其他属性 

 该对象定义的任何属性都将这个类的所有实例继承。 

  

 */ 

 //拨号,这里只是返回电话号码 

Mobile.prototype.dial = function(phoneNo) { 

    return phoneNo; 

}; 

 

 

/**//* 

 定义类的第三步是定义类方法,常量和其他必要的类属性,作为构造函数自身的属性,而不是构造函数 

 原型对象的属性,注意,类方法没有使用关键字this,因为他们只对他们的实际参数进行操作。 

 */ 

//开机关机方法 

Mobile.turnOn=function() { 

   return "The power of mobile is on"; 

} 

Mobile.turnOff=function() { 

   return "The power of mobile is off"; 

}


//类属性,这样他们就可以被用作常量,注意实际上他们并不是只读的

Mobile.screenColor=64K;//假设该类手机的屏幕颜色都是64K彩屏的
四、子类化
   JavaScript支持子类化,只需把子类的原型对象用超类实例化即可,但是应该注意,这样子类化之后就会存在一个问题,由于是用超类实例化子类的原型对象取得的,所以就冲掉了自己本身的由JavaScript提供的constructor属性,为了确保constructor的正确性,需要重新指定一下,子类化的程序例子如下:
   /*****  子类化  *****/
//下面是子类构造函数智能型手机
function SmartPhone(os)
{
  this.os=os;

}
//我们将Mobile对象作为它的原型
//这意味着新类的实例将继承SmartPhone.prototype,
//后者由Mobile.prototype继承而来
//Mobile.prototype又由Object.prototype继承而来
SmartPhone.prototype=new Mobile(GSM,Nokia);
//下面给子类添加一个新方法,发送电子邮件,这里只是返回Email地址
SmartPhone.prototype.sendEmail=function(emailAddress) {
  return this.emailAddress
}
//上面的子类化方法有一点缺陷,由于我们明确把SmartPhone.prototype设成了我们所创建的一个对象,所以就覆盖了JS提供
//的原型对象,而且丢弃了给定的Constructor属性。该属性引用的是创建这个对象的构造函数。但是SmartPhone对象集成了它的
//父类的constructor,它自己没有这个属性,明确设置着一个属性可以解决这个问题:
SmartPhone.prototype.constructor=SmartPhone;
var objSmartPhone=new SmartPhone();//实例化子类

Javascript 相关文章推荐
js汉字排序问题 支持中英文混排,兼容各浏览器,包括CHROME
Dec 20 Javascript
js复制到剪切板的实例方法
Jun 28 Javascript
js兼容pc端浏览器并有多种弹出小提示的手机端浮层控件实例
Apr 29 Javascript
解析jquery easyui tree异步加载子节点问题
Mar 08 Javascript
ReactNative页面跳转Navigator实现的示例代码
Aug 02 Javascript
React从react-router路由上做登陆验证控制的方法
May 10 Javascript
Vue-不允许嵌套式的渲染方法
Sep 13 Javascript
Vue插值、表达式、分隔符、指令知识小结
Oct 12 Javascript
vue transition 在子组件中失效的解决
Nov 12 Javascript
js实现橱窗展示效果
Jan 11 Javascript
原生js实现ajax请求和JSONP跨域请求操作示例
Mar 14 Javascript
在nuxt中使用路由重定向的实例
Nov 06 Javascript
理解JavaScript中的事件
Sep 23 #Javascript
Valerio 发布了 Mootools
Sep 23 #Javascript
prototype.js的Ajax对象
Sep 23 #Javascript
在Javascript中为String对象添加trim,ltrim,rtrim方法
Sep 22 #Javascript
如何实现JS函数的重载
Sep 22 #Javascript
扩展String功能方法
Sep 22 #Javascript
js实现ASP分页函数 HTML分页函数
Sep 22 #Javascript
You might like
PHP也可以?成Shell Script
2006/10/09 PHP
php生成随机数或者字符串的代码
2008/09/05 PHP
打造超酷的PHP数据饼图效果实现代码
2011/11/23 PHP
PHP_Cooikes不同页面无法传递的解决方法
2014/03/07 PHP
PHP实现的Redis多库选择功能单例类
2017/07/27 PHP
JS 文件本身编码转换 图文教程
2009/10/12 Javascript
js escape,unescape解决中文乱码问题的方法
2010/05/26 Javascript
jquery插件jSignature实现手动签名
2015/05/04 Javascript
学习JavaScript设计模式之模板方法模式
2016/01/20 Javascript
JavaScript基础知识之方法汇总结
2016/01/24 Javascript
探索angularjs+requirejs全面实现按需加载的套路
2016/02/26 Javascript
微信小程序之数据缓存的实例详解
2017/09/29 Javascript
在Vue项目中引入腾讯验证码服务的教程
2018/04/03 Javascript
微信小程序form表单组件示例代码
2018/07/15 Javascript
Postman的下载及安装教程详解
2018/10/16 Javascript
vue 列表页跳转详情页获取id以及详情页通过id获取数据
2019/03/27 Javascript
详解关于webpack多入口热加载很慢的原因
2019/04/24 Javascript
[01:01:29]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第一场
2018/04/05 DOTA
关于Python元祖,列表,字典,集合的比较
2017/01/06 Python
详解Python中的Numpy、SciPy、MatPlotLib安装与配置
2017/11/17 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
2018/02/26 Python
Python删除n行后的其他行方法
2019/01/28 Python
python 批量解压压缩文件的实例代码
2019/06/27 Python
基于Python的图像数据增强Data Augmentation解析
2019/08/13 Python
Python实现自动打开电脑应用的示例代码
2020/04/17 Python
django模板获取list中指定索引的值方式
2020/05/14 Python
Django通过设置CORS解决跨域问题
2020/11/26 Python
TensorFlow的环境配置与安装方法
2021/02/20 Python
Javascript 高级手势使用介绍
2013/04/21 HTML / CSS
Under Armour安德玛中国官网:美国高端运动科技品牌
2018/03/09 全球购物
党员对照检查材料思想汇报(党的群众路线)
2014/09/24 职场文书
幼儿园大班个人总结
2015/02/28 职场文书
2015年结对帮扶工作总结
2015/05/04 职场文书
天河观后感
2015/06/11 职场文书
房屋产权证明书
2015/06/19 职场文书
2016年毕业实习心得体会范文
2015/10/09 职场文书