浅谈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 相关文章推荐
js截取字符串的两种方法及区别详解
Nov 05 Javascript
js中this的用法实例分析
Jan 10 Javascript
JavaScript中逗号运算符介绍及使用示例
Mar 13 Javascript
JS继承之借用构造函数继承和组合继承
Sep 07 Javascript
jquery延迟对象解析
Oct 26 Javascript
js仿京东轮播效果 选项卡套选项卡使用
Jan 12 Javascript
浅谈javascript的url参数parse和build函数
Mar 04 Javascript
原JS实现banner图的常用功能
Jun 12 Javascript
jquery实现左右轮播图效果
Sep 28 jQuery
JS操作字符串转数字的常见方法示例
Oct 29 Javascript
JS手写一个自定义Promise操作示例
Mar 16 Javascript
js实现数据导出为EXCEL(支持大量数据导出)
Mar 31 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
javascript 小型动画组件与实现代码
2010/06/02 PHP
PHP设置Cookie的HTTPONLY属性方法
2017/02/09 PHP
javascript 时间比较实现代码
2009/10/28 Javascript
模仿JQuery sortable效果 代码有错但值得看看
2009/11/05 Javascript
JavaScript中获取未知对象属性的代码
2011/04/27 Javascript
js的alert样式如何更改如背景颜色
2014/01/22 Javascript
javascript实现文本域写入字符时限定字数
2014/02/12 Javascript
教你如何自定义百度分享插件以及bshare分享插件的分享按钮
2014/06/20 Javascript
Node.js中JavaScript操作MySQL的常用方法整理
2016/03/01 Javascript
JavaScript实现横线提示输入验证码随输入验证码输入消失的方法
2016/09/24 Javascript
Node.js批量给图片加水印的方法
2016/11/15 Javascript
Vue隐藏显示、只读实例代码
2018/07/18 Javascript
angularJs中ng-model-options设置数据同步的方法
2018/09/30 Javascript
LayUI数据接口返回实体封装的例子
2019/09/12 Javascript
一篇文章看懂JavaScript中的回调
2021/01/05 Javascript
[56:46]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VP vs Effect
2018/04/01 DOTA
python通过post提交数据的方法
2015/05/06 Python
Python提取Linux内核源代码的目录结构实现方法
2016/06/24 Python
对python中不同模块(函数、类、变量)的调用详解
2019/07/16 Python
python实现车牌识别的示例代码
2019/08/05 Python
Pyecharts绘制全球流向图的示例代码
2020/01/08 Python
Django之富文本(获取内容,设置内容方式)
2020/05/21 Python
使用python实现下载我们想听的歌曲,速度超快
2020/07/09 Python
详解用 python-docx 创建浮动图片
2021/01/24 Python
HTML5地理定位实例
2014/10/15 HTML / CSS
波兰电子产品购物网站:Vobis
2019/05/26 全球购物
linux面试相关问题
2012/08/11 面试题
业务经理的岗位职责
2013/11/16 职场文书
财务会计人员岗位职责
2013/11/30 职场文书
预备党员政审材料
2014/02/04 职场文书
《珍珠泉》教学反思
2014/02/20 职场文书
财务会计大学生自我评价
2014/04/09 职场文书
园林专业毕业生自荐信
2014/07/04 职场文书
村主任个人对照检查材料
2014/10/01 职场文书
党员评议表自我评价范文
2014/10/20 职场文书
化工见习报告范文
2014/10/31 职场文书