javascript类继承机制的原理分析


Posted in Javascript onSeptember 12, 2009

目前 javascript的实现继承方式并不是通过“extend”关键字来实现的,而是通过 constructor function和prototype属性来实现继承。首先我们创建一个animal 类

js 代码

var animal = function (){ //这就是constructor function 了 this .name = 'pipi'; 
this .age = 10; 
this .height = 0; 
} 
//建立一个动物的实例 
var a1 = new animal ();

构造函数与其他普通函数区别在于,1.构造函数里有 this关键字,2.调用构造函数是使用的new关键字。通过new运算符调用构造函数 animal 后,系统就会返回一个对象,这个对象就相当于
var a1 = { name:'pipi' ,age:10,height:0 } 
//或者 
var a1 = new Object(); 
a1.name='pipi'; 
a1.age = 10; 
a1.height = 0;

等同这样的方式来产生js对象。
到这里我们知道如何在js中定义一个类了,接下来我们展示如何写一个cat
var cat = function (){ 
this .play = function (){ 
alert('cat play') 
} 
} 
cat .prototype = new animal (); 
//prototype 属性指向一个对象 
var c1 = new cat();

到这里,cat就继承了 animal 对象,类cat的一个实例对象c1拥有属性name,age,height,和方法play了。
那么 prototype起到了一个什么样的作用呢?
prototype就好比一个指针,它指向一个object,这个object就称为子类对象的原型。当cat的对象被创建的时候,由于cat的构造函数拥有prototype属性,那么cat的实例就会间接指向这个原型对象了(说成间接的是因为每个object都有一个 constructor 属性指向它的构造函数)。
那么问题来了,“当我们修改对象 c1 的name属性的时候,会不会修改它prototype的name属性值呢?”,答案是否定的。
接下来详细解析:
1.访问name属性: 首先当我们第一次访问c1.name的属性的时候,我们会得到值“pipi”,这个和我们预料中的一样。但是计算过程你未必知道。
它计算的过程是这样的:第一步:检查c1对象中是否有name属性,找到的话就返回值,没有就跳到第二步,显然没有找到,因为cat的构造函数中没有定义。第二步:当第一步没有找时,去间接访问 prototype对象所指向的object,如果在 prototype对象中 找到的name属性的话,就返回找到的属性值。如果还是没有找到的话,再去递归地寻找 prototype对象的 prototype对象(去找它的爷爷) ,一直到找到name属性或者没有prototype对象为止。如果到最后还是没有找到name属性的话就返回undefined。
2.设定name属性:当我们设定c1对象的name属性时,及调用 c1.name= ' new name'; 这个过程就简单多了。首先检查是否对象已有该属性,若已存在则修改当前值,若不存在则为该对象新增一个属性并设定当前值。值得一提的是,在设定值的过程中没有去访问 prototype属性。
为了加深理解,我们再看一个 read-write-read 的过程,第一次read的时候,由于自己的对象没有name属性,那么就会返回的原型对象的name属性的值。第二步,写入name的值,同样没发现本身对象有name属性,那么就在本身对象上新建一个name属性,然后赋值。第三步,再次读取name属性,由于在第二步中已经新建了name属性,此时就返回在第二步中设定的值。值得一提的是,在这三步中没有改变原型对象的值。
好了,到此详细分析了 javascript对象是如果实现继承的,其实和其他的面向对象语言不一样的是,javascript的继承机制是对象的原型继承而不是类型继承。
呵呵,欢迎看完,有不对的地方欢迎大家讨论!
Javascript 相关文章推荐
javascript event在FF和IE的兼容传参心得(绝对好用)
Jul 10 Javascript
node.js中的fs.utimes方法使用说明
Dec 15 Javascript
基于jQuery创建鼠标悬停效果的方法
Mar 07 Javascript
AngularJS中的过滤器使用详解
Jun 16 Javascript
js实现简单的碰壁反弹效果
Aug 30 Javascript
微信小程序去哪里找 小程序到底如何使用(附小程序名单)
Jan 09 Javascript
jquery仿ps颜色拾取功能
Mar 08 Javascript
JS图片轮播与索引变色功能实例详解
Jul 06 Javascript
iview在vue-cli3如何按需加载的方法
Oct 31 Javascript
JavaScript简单实现动态改变HTML内容的方法示例
Dec 25 Javascript
微信小程序wepy框架学习和使用心得详解
May 24 Javascript
JavaScript中关于预编译、作用域链和闭包的理解
Mar 31 Javascript
javascript 类定义的4种方法
Sep 12 #Javascript
一个简单的javascript类定义例子
Sep 12 #Javascript
一个简单的JavaScript 日期计算算法
Sep 11 #Javascript
关于javascript 回调函数中变量作用域的讨论
Sep 11 #Javascript
javascript 一些用法小结
Sep 11 #Javascript
JS 日期验证正则附asp日期格式化函数
Sep 11 #Javascript
jquery 简单导航实现代码
Sep 11 #Javascript
You might like
PHP 正则表达式之正则处理函数小结(preg_match,preg_match_all,preg_replace,preg_split)
2012/10/05 PHP
PHP中通过HTTP_USER_AGENT判断是否为手机移动终端的函数代码
2013/02/14 PHP
使用Apache的htaccess防止图片被盗链的解决方法
2013/04/27 PHP
PHP SPL标准库之SplFixedArray使用实例
2015/05/12 PHP
jquery+php实现导出datatables插件数据到excel的方法
2015/07/06 PHP
thinkphp Apache配置重启Apache1 restart 出错解决办法
2017/02/15 PHP
Yii2中添加全局函数的方法分析
2017/05/04 PHP
jQuery获取地址栏参数插件(模仿C#)
2010/10/26 Javascript
JQUBar 基于JQUERY的柱状图插件
2010/11/23 Javascript
事件绑定之小测试  onclick && addEventListener
2011/07/31 Javascript
js 将json字符串转换为json对象的方法解析
2013/11/13 Javascript
JavaScript实现弹出子窗口并传值给父窗口
2014/12/18 Javascript
简介AngularJS中使用factory和service的方法
2015/06/17 Javascript
node.js调用C++开发的模块实例
2015/07/03 Javascript
js事件处理程序跨浏览器解决方案
2016/03/27 Javascript
javascript用rem来做响应式开发
2018/01/13 Javascript
angular 数据绑定之[]和{{}}的区别
2018/09/25 Javascript
详解Vue内部怎样处理props选项的多种写法
2018/11/06 Javascript
Angular使用Restful的增删改
2018/12/28 Javascript
vue前后分离调起微信支付
2019/07/29 Javascript
[02:32]【DOTA2亚洲邀请赛】iceice,梦开始的地方
2017/03/13 DOTA
[08:08]DOTA2-DPC中国联赛2月28日Recap集锦
2021/03/11 DOTA
为python设置socket代理的方法
2015/01/14 Python
python爬取哈尔滨天气信息
2018/07/14 Python
Python使用try except处理程序异常的三种常用方法分析
2018/09/05 Python
Python3.4学习笔记之列表、数组操作示例
2019/03/01 Python
Python正则表达式匹配数字和小数的方法
2019/07/03 Python
Python企业编码生成系统之主程序模块设计详解
2019/07/26 Python
基于Tensorflow的MNIST手写数字识别分类
2020/06/17 Python
Manjaro、pip、conda更换国内源的方法
2020/11/17 Python
Merchant 1948澳大利亚:新西兰领先的鞋类和靴子供应商
2018/03/24 全球购物
在浏览器端如何得到服务器端响应的XML数据
2012/11/24 面试题
高中毕业自我评价
2014/02/08 职场文书
航海技术专业毕业生求职信
2014/04/06 职场文书
关于运动会广播稿300字
2014/10/05 职场文书
Python趣味实战之手把手教你实现举牌小人生成器
2021/06/07 Python