浅谈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 相关文章推荐
javascript仿php的print_r函数输出json数据
Sep 13 Javascript
JavaScript fontsize方法入门实例(按照指定的尺寸来显示字符串)
Oct 17 Javascript
在Javascript操作JSON对象,增加 删除 修改的简单实现
Jun 02 Javascript
JS实现漂亮的时间选择框效果
Aug 20 Javascript
bootstrap table sum总数量统计实现方法
Oct 29 Javascript
详解Webpack + ES6 最新环境搭建与配置
Jun 04 Javascript
JavaScript实现的鼠标跟随特效示例【2则实例】
Dec 22 Javascript
node.js中ws模块创建服务端和客户端,网页WebSocket客户端
Mar 06 Javascript
jquery 时间戳转日期过程详解
Oct 12 jQuery
在vue+element ui框架里实现lodash的debounce防抖
Nov 13 Javascript
vue使用自定义事件的表单输入组件用法详解【日期组件与货币组件】
Jun 01 Javascript
Vue+Spring Boot简单用户登录(附Demo)
Nov 12 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
php 无法载入mysql扩展
2010/03/12 PHP
javascript Zifa FormValid 0.1表单验证 代码打包下载
2007/06/08 Javascript
HTML中事件触发列表与解说
2007/07/09 Javascript
自己动手开发jQuery插件教程
2011/08/25 Javascript
jquery $.each 和for怎么跳出循环终止本次循环
2013/09/27 Javascript
JS完整获取IE浏览器信息包括类型、版本、语言等等
2014/05/22 Javascript
Javascript动画效果(3)
2016/10/11 Javascript
vue.js将unix时间戳转换为自定义时间格式
2017/01/03 Javascript
H5手机端多文件上传预览插件
2017/04/21 Javascript
JavaScript 数组的进化与性能分析
2017/09/18 Javascript
详解ionic本地相册、拍照、裁剪、上传(单图完全版)
2017/10/10 Javascript
js操作两个json数组合并、去重,以及删除某一项元素
2020/09/22 Javascript
[03:03]DOTA2校园争霸赛 济南城市决赛欢乐发奖活动
2013/10/21 DOTA
[00:10]DOTA2全国高校联赛速递
2018/05/30 DOTA
[01:04:08]完美世界DOTA2联赛PWL S3 INK ICE vs GXR 第一场 12.16
2020/12/18 DOTA
Python的装饰器模式与面向切面编程详解
2015/06/21 Python
玩转python爬虫之爬取糗事百科段子
2016/02/17 Python
详解python之简单主机批量管理工具
2017/01/27 Python
Python中异常重试的解决方案详解
2017/05/05 Python
Python读取文件内容的三种常用方式及效率比较
2017/10/07 Python
influx+grafana自定义python采集数据和一些坑的总结
2018/09/17 Python
从0开始的Python学习016异常
2019/04/08 Python
基于python生成英文版词云图代码实例
2020/05/16 Python
将不规则的Python多维数组拉平到一维的方法实现
2021/01/11 Python
浅谈html5 响应式布局
2014/12/24 HTML / CSS
描述JSP和Servlet的区别、共同点、各自应用的范围
2012/10/02 面试题
大学新生军训个人的自我评价
2013/10/03 职场文书
部队领导证婚词
2014/01/12 职场文书
玲玲的画教学反思
2014/02/04 职场文书
纪检监察建议书
2014/05/19 职场文书
销售提升方案
2014/06/07 职场文书
四风问题原因分析及整改措施
2014/10/24 职场文书
2014最新自愿离婚协议书范本
2014/11/19 职场文书
小学教师个人工作总结2015
2015/04/20 职场文书
执行力心得体会范文
2016/01/11 职场文书
Android开发 使用文件储存的方式保存QQ密码
2022/04/24 Java/Android