浅谈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 相关文章推荐
jquery 的 $("#id").html() 无内容的解决方法
Jun 07 Javascript
window.onload追加函数使用示例
Mar 03 Javascript
js绘制购物车抛物线动画
Nov 18 Javascript
再谈javascript注入 黑客必备!
Sep 14 Javascript
Bootstrap CSS使用方法
Dec 23 Javascript
详解windows下vue-cli及webpack 构建网站(三)使用组件
Jun 17 Javascript
微信小程序获取循环元素id以及wx.login登录操作
Aug 17 Javascript
three.js中文文档学习之通过模块导入
Nov 20 Javascript
Angular2中监听数据更新的方法
Aug 31 Javascript
ng-events类似ionic中Events的angular全局事件
Sep 05 Javascript
微信小程序城市选择及搜索功能的方法
Mar 22 Javascript
JavaScript中this函数使用实例解析
Feb 21 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
给海燕B411配件机起死回生配上件
2021/03/02 无线电
用PHP读取IMAP邮件
2006/10/09 PHP
php实现的数组转xml案例分析
2019/09/28 PHP
纯JAVASCRIPT图表动画插件Highcharts Examples
2011/04/16 Javascript
js阻止事件追加的具体实现
2014/10/15 Javascript
浅析javascript 定时器
2014/12/23 Javascript
基于javascript代码检测访问网页的浏览器呈现引擎、平台、Windows操作系统、移动设备和游戏系统
2015/12/03 Javascript
js判断checkbox是否选中个数的方法(超简单)
2016/08/19 Javascript
jQuery树形插件jquery.simpleTree.js用法分析
2016/09/05 Javascript
详解angular element()方法使用
2017/04/08 Javascript
get  post jsonp三种数据交互形式实例详解
2017/08/25 Javascript
Vue高版本中一些新特性的使用详解
2018/09/25 Javascript
vue项目前端埋点的实现
2019/03/06 Javascript
element-ui tree结构实现增删改自定义功能代码
2020/08/31 Javascript
Python模块学习 filecmp 文件比较
2012/08/27 Python
python实现识别相似图片小结
2016/02/22 Python
python实现用户登录系统
2016/05/21 Python
利用python解决mysql视图导入导出依赖的问题
2017/12/17 Python
Python爬虫基础之XPath语法与lxml库的用法详解
2018/09/13 Python
Matplotlib 折线图plot()所有用法详解
2020/07/28 Python
python 如何使用find和find_all爬虫、找文本的实现
2020/10/16 Python
python Gabor滤波器讲解
2020/10/26 Python
深入浅析CSS3中的Flex布局整理
2020/04/27 HTML / CSS
公司委托书范本
2014/04/04 职场文书
大学毕业寄语大全
2014/04/10 职场文书
《池塘边的叫声》教学反思
2014/04/12 职场文书
《回乡偶书》教学反思
2014/04/12 职场文书
员工考核评语大全
2014/04/26 职场文书
防沙治沙典型材料
2014/05/07 职场文书
六一文艺汇演主持词
2015/06/30 职场文书
2015年城管执法工作总结
2015/07/23 职场文书
公司开业的祝贺语大全(60条)
2019/07/05 职场文书
迎客户欢迎词三篇
2019/09/27 职场文书
PHP命令行与定时任务
2021/04/01 PHP
Pandas自定义选项option设置
2021/07/25 Python
零基础学java之带参数以及返回值的方法
2022/04/10 Java/Android