浅谈Javascript实现继承的方法


Posted in Javascript onJuly 06, 2015

S1:js中一切皆对象,想想如果要实现对父对象属性和方法的继承,最初我们会怎样子来实现呢,考虑到原型的概念,最初我是这样来实现继承的

function Parent(){
   this.name='123';
}
Parent.prototype.getName=function(){
   return this.name;
}
function Son(){
   this.age=20;
}
Son.prototype=new Parent();
Son.prototype.getAge=function(){
   return this.age;
}
var son=new Son();
console.log('Name :'+son.getName()+';Age: '+son.getAge());
 
 
VM1777:16 Name :123;Age: 20

从上面可以看到实现对Parent的继承主要是覆写了Son的prototype,这样便把Parent的属性和方法过给了Son的原型,这样子在通过new Son()构造出来的对象均会继承来自原型【即父对象Parent】的属性和方法,这样就达到了继承效果;但这样会带来一个副作用,就是当父对象中包含引用类型的属性时,子对象对引用类型数据的修改,会影响到所有的子对象,显然这不是我们需要的效果:

function Parent(){
   this.name='123';
   this.fruits=['apple'];
}
Parent.prototype.getName=function(){
   return this.name;
}
function Son(){
   this.age=20;
}
Son.prototype=new Parent();
Son.prototype.getAge=function(){
   return this.age;
}
var son=new Son();
var son1=new Son();
console.log(son.fruits);//["apple"]
console.log(son1.fruits);//["apple"]
son.fruits.push('pear');
console.log(son.fruits);//["apple", "pear"]
console.log(son1.fruits);//["apple", "pear"]

S2:目前想到要解决这个问题就是使每个子对象都拥有一份父对象属性的复制品,这样修改属性时只是修改了子对象下的属性,而不会影响到其他的子对象属性。这一目标的实现参照前人的对象冒充的方式来实现

function Parent(){
   this.name='123';
   this.fruits=['apple'];
}
Parent.prototype.getName=function(){
   return this.name;
}
function Son(){
   Parent.call(this);
   this.age=20;
}
Son.prototype=new Parent();
Son.prototype.getAge=function(){
   return this.age;
}
var son=new Son();
var son1=new Son();
console.log(son.fruits);//["apple"]
console.log(son1.fruits);//["apple"]
son.fruits.push('pear');
console.log(son.fruits);//["apple", "pear"]
console.log(son1.fruits);//["apple"]

上面我在Son函数里加了Parent.call(this)实现在new Son()的时候将this[即new 出来的Son对象]冒充成Parent函数里的上下文this来调用Parent()函数,从而拿到了父对象的属性和方法副本,所以在接下来修改父对象的属性和方法时其实是修改的副本,故达到了不会影响全部子对象的效果。但是由于Son.prototype=new Parent()的使用,我们得到了两份实例的属性和方法,而再我们拿到了副本以后,只是需要父对象的原型就行了,从下面可以看出我们只需要原型中的getname();

浅谈Javascript实现继承的方法

S3:接下来就是要去掉一份实例的属性和方法,这时候是constructor发挥作用的时候了,看下边代码,将Parent.prototype重新构建成一个原生对象,来作为子对象的原型,再把constructor指向子构造器

function Parent(){
   this.name='123';
   this.fruits=['apple'];
}
Parent.prototype.getName=function(){
   return this.name;
}
function Son(){
   Parent.call(this);
   this.age=20;
}
function Extend(Parent,Son){
   var proto = new Object(Parent.prototype);
   proto.constructor = Son;
   Son.prototype=proto;
}
Extend(Parent,Son);
Son.prototype.getAge=function(){
   return this.age;
}

浅谈Javascript实现继承的方法

以上所述就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
用 JSON 处理缓存
Apr 27 Javascript
javascript下判断一个对象是否具有指定名称的属性的的代码
Jan 11 Javascript
关于jQuery参考实例2.0 用jQuery选择元素
Apr 07 Javascript
jQuery实现长文字部分显示代码
May 13 Javascript
jquery easyui 对于开始时间小于结束时间的判断示例
Mar 22 Javascript
Angular使用Md5加密的解决方法
Sep 16 Javascript
Node.js readline模块与util模块的使用
Mar 01 Javascript
vux uploader 图片上传组件的安装使用方法
May 15 Javascript
JS打印彩色菱形的实例代码
Aug 15 Javascript
深入浅出了解Node.js Streams
May 27 Javascript
Vue 自定义指令功能完整实例
Sep 17 Javascript
layer弹窗在键盘按回车将反复刷新的实现方法
Sep 25 Javascript
JavaScript保存并运算页面中数字类型变量的写法
Jul 06 #Javascript
angularjs客户端实现压缩图片文件并上传实例
Jul 06 #Javascript
jQuery 遍历函数详解
Jul 05 #Javascript
php结合imgareaselect实现图片裁剪
Jul 05 #Javascript
kindeditor编辑器点中图片滚动条往上顶的bug
Jul 05 #Javascript
jQuery插件pagewalkthrough实现引导页效果
Jul 05 #Javascript
IE浏览器下PNG相关功能
Jul 05 #Javascript
You might like
新安装的MySQL数据库需要注意的安全知识
2008/07/30 PHP
PHP对字符串的递增运算分析
2010/08/08 PHP
PHP把MSSQL数据导入到MYSQL的方法
2014/12/27 PHP
PHP树的深度编历生成迷宫及A*自动寻路算法实例分析
2015/03/10 PHP
PHP序列化操作方法分析
2016/09/28 PHP
PHP下的浮点运算不准的解决方法
2016/10/27 PHP
prototype Element学习笔记(篇一)
2008/10/26 Javascript
关于用Jquery的height()、width()计算动态插入的IMG标签的宽高的问题
2010/12/08 Javascript
json数据的列循环示例
2013/09/06 Javascript
js中的scroll和offset 使用比较的实例与分析
2013/09/29 Javascript
基于jquery的9行js轻松实现tab控件示例
2013/10/12 Javascript
JQuery选择器、过滤器大整理
2015/05/26 Javascript
Web性能优化系列 10个提升JavaScript性能的技巧
2016/09/27 Javascript
Vue中 v-if 和v-else-if页面加载出现闪现的问题及解决方法
2018/10/12 Javascript
Webpack 4如何动态切割JS注入文件名详解
2019/07/09 Javascript
VUE前后端学习tab写法实例
2019/08/06 Javascript
微信小程序之高德地图多点路线规划过程示例详解
2021/01/18 Javascript
[03:01]2014DOTA2国际邀请赛 DC:我是核弹粉,为Burning和国土祝福
2014/07/13 DOTA
python人人网登录应用实例
2014/09/26 Python
Python循环语句之break与continue的用法
2015/10/14 Python
python实现SOM算法
2018/02/23 Python
python字典一键多值实例代码分享
2019/06/14 Python
python打印直角三角形与等腰三角形实例代码
2019/10/20 Python
Shell如何接收变量输入
2016/08/06 面试题
研究生自荐信
2013/10/09 职场文书
高中自我鉴定
2013/12/20 职场文书
超市仓管员岗位职责
2014/04/07 职场文书
大学生学习面向未来的赶考思想汇报
2014/09/12 职场文书
授权委托书
2014/09/17 职场文书
党的群众路线对照检查材料(个人)
2014/09/24 职场文书
死亡证明书样本说明
2014/10/18 职场文书
格列佛游记读书笔记
2015/06/30 职场文书
教师外出学习心得体会
2016/01/18 职场文书
史上最全书信经典范文大全(建议收藏)
2019/07/10 职场文书
成人成长感言如何写?
2019/08/16 职场文书
Python天气语音播报小助手
2021/09/25 Python