浅谈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 相关文章推荐
修改发贴的编辑功能
Mar 07 Javascript
js调试工具 Javascript Debug Toolkit 2.0.0版本发布
Dec 02 Javascript
jQuery DOM操作小结与实例
Jan 07 Javascript
关于jquery ajax 调用带参数的webservice返回XML数据一个小细节
Jul 31 Javascript
自己写了一个展开和收起的多更能型的js效果
Mar 05 Javascript
上传的js验证(图片/文件的扩展名)
Apr 25 Javascript
javascript实现实时输出当前的时间
Apr 27 Javascript
解决Window10系统下Node安装报错的问题分析
Dec 13 Javascript
Vue 短信验证码组件开发详解
Feb 14 Javascript
使用 electron 实现类似新版 QQ 的登录界面效果(阴影、背景动画、窗体3D翻转)
Oct 23 Javascript
微信小程序自定义tabbar custom-tab-bar 6s出不来解决方案(cover-view不兼容)
Nov 01 Javascript
vuex的数据渲染与修改浅析
Nov 26 Vue.js
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错误Warning:mysql_query()解决方法
2015/10/24 PHP
php使用CURL模拟GET与POST向微信接口提交及获取数据的方法
2016/09/23 PHP
如何修改Laravel中url()函数生成URL的根地址
2017/08/11 PHP
yii2 上传图片的示例代码
2018/11/02 PHP
JS声明变量背后的编译原理剖析
2012/12/28 Javascript
JQuery处理json与ajax返回JSON实例代码
2014/01/03 Javascript
jQuery实现冻结表头的方法
2015/03/09 Javascript
Javascript中arguments和arguments.callee的区别浅析
2015/04/24 Javascript
javascript实现的固定位置悬浮窗口实例
2015/04/30 Javascript
包含中国城市的javascript对象实例
2015/08/03 Javascript
基于jQuery实现Accordion手风琴自定义插件
2020/10/13 Javascript
有趣的bootstrap走动进度条
2016/12/01 Javascript
JavaScript正则表达式小结(test|match|search|replace|split|exec)
2016/12/08 Javascript
Vue模拟数据,实现路由进入商品详情页面的示例
2018/08/31 Javascript
手把手带你封装一个vue component第三方库
2019/02/14 Javascript
深入理解令牌认证机制(token)
2019/08/22 Javascript
浅谈vue.watch的触发条件是什么
2020/11/07 Javascript
[02:48]DOTA2超级联赛专访海涛:你们的选择没有错
2013/06/07 DOTA
深入理解Python中range和xrange的区别
2017/11/26 Python
python pandas写入excel文件的方法示例
2019/06/25 Python
python卸载后再次安装遇到的问题解决
2019/07/10 Python
python flask web服务实现更换默认端口和IP的方法
2019/07/26 Python
Python CVXOPT模块安装及使用解析
2019/08/01 Python
深入浅析python的第三方库pandas
2020/02/13 Python
详解html5 canvas常用api总结(二)--绘图API
2016/12/14 HTML / CSS
Ajax主要包含了哪些技术
2014/06/12 面试题
工厂厂长岗位职责
2013/11/08 职场文书
房地产促销活动方案
2014/03/01 职场文书
前处理班长职位说明书
2014/03/01 职场文书
白血病捐款倡议书
2014/05/14 职场文书
党员自我评议个人对照检查材料
2014/09/16 职场文书
上班迟到检讨书
2015/05/06 职场文书
2015年污水处理厂工作总结
2015/05/26 职场文书
寻找最美乡村教师观后感
2015/06/18 职场文书
教你一步步实现一个简易promise
2021/11/02 Javascript
在ubuntu下安装go开发环境的全过程
2022/08/05 Golang