浅谈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 相关文章推荐
jQuery为iframe的body添加click事件的实现代码
Apr 07 Javascript
jQuery EasyUI API 中文文档 - NumberBox数字框
Oct 13 Javascript
js中符号转意问题示例探讨
Aug 19 Javascript
js改变文章字体大小的实例代码
Nov 27 Javascript
jquery简单实现鼠标经过导航条改变背景图
Dec 17 Javascript
详解JavaScript语法对{}处理的坑爹之处
Jun 05 Javascript
JS实现同一个网页布局滑动门和TAB选项卡实例
Sep 23 Javascript
简单谈谈node.js 版本控制 nvm和 n
Oct 15 Javascript
JS模拟实现方法重载示例
Aug 03 Javascript
Javascript实现代码折叠功能
Aug 25 Javascript
vue实现跨域的方法分析
May 21 Javascript
vue实现短信验证码登录功能(流程详解)
Dec 10 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 的几个配置文件函数
2006/12/21 PHP
PHP生成图片验证码功能示例
2017/01/12 PHP
jQuery学习7 操作JavaScript对象和集合的函数
2010/02/07 Javascript
遍历DOM对象内的元素属性示例代码
2014/02/08 Javascript
jQuery实现鼠标经过图片预览大图效果
2014/04/10 Javascript
jQuery基于当前元素进行下一步的遍历
2014/05/20 Javascript
jQuery实现可以控制图片旋转角度效果(附demo源码下载)
2016/01/27 Javascript
javascript使用Promise对象实现异步编程
2016/03/01 Javascript
Bootstrap栅格系统的使用和理解2
2016/12/14 Javascript
JS返回只包含数字类型的数组实例分析
2016/12/16 Javascript
Angular-Touch库用法示例
2016/12/22 Javascript
angular双向绑定模拟探索
2016/12/26 Javascript
vue.js动态数据绑定学习笔记
2017/05/19 Javascript
详解JS数据类型的值拷贝函数(深拷贝)
2017/07/13 Javascript
jquery animate动画持续运动的实例
2017/11/29 jQuery
Vue实现动态创建和删除数据的方法
2018/03/17 Javascript
vue 使用lodash实现对象数组深拷贝操作
2020/09/10 Javascript
python实现去除下载电影和电视剧文件名中的多余字符的方法
2014/09/23 Python
理解Python中的绝对路径和相对路径
2017/08/30 Python
Python selenium抓取微博内容的示例代码
2018/05/17 Python
django开发post接口简单案例,获取参数值的方法
2018/12/11 Python
TensorFlow自定义损失函数来预测商品销售量
2020/02/05 Python
Python编程快速上手——强口令检测算法案例分析
2020/02/29 Python
详解python如何引用包package
2020/06/07 Python
Python高并发解决方案实现过程详解
2020/07/31 Python
python绘制汉诺塔
2021/03/01 Python
HTML5各种头部meta标签的功能(推荐)
2017/03/13 HTML / CSS
德国汉莎航空中国官网: Lufthansa中国
2017/03/30 全球购物
加拿大领先的优质厨具产品在线购物网站:Golda’s Kitchen
2017/11/17 全球购物
Zadig&Voltaire官网:法国时装品牌
2018/01/05 全球购物
美国领先的家庭智能音响系统品牌:Sonos
2018/07/20 全球购物
英国独特家具和家庭用品购物网站:Cuckooland
2020/08/30 全球购物
教师竞聘演讲稿
2014/05/16 职场文书
小学安全教育月活动总结
2014/07/07 职场文书
学生顶撞老师的检讨书
2014/09/17 职场文书
CSS实现隐藏搜索框功能(动画正反向序列)
2021/07/21 HTML / CSS