浅谈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创建自定义对象 创建Object实例添加属性和方法
Jun 04 Javascript
JavaScript地图拖动功能SpryMap的简单实现
Jul 17 Javascript
parentElement,srcElement的使用小结
Jan 13 Javascript
jQuery图片切换插件jquery.cycle.js使用示例
Jun 16 Javascript
Javascript判断文件是否存在(客户端/服务器端)
Sep 16 Javascript
javascript消除window.close()的提示窗口
May 20 Javascript
Javascript中实现String.startsWith和endsWith方法
Jun 10 Javascript
JS使用JSON作为参数实例分析
Jun 23 Javascript
一种基于浏览器的自动小票机打印实现方案(js版)
Jul 26 Javascript
VueJs 搭建Axios接口请求工具
Nov 20 Javascript
js+canvas实现纸牌游戏
Mar 16 Javascript
React 条件渲染最佳实践小结(7种)
Sep 27 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基础知识:类与对象(4) 范围解析操作符(::)
2006/12/13 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
2017/11/17 PHP
PDO::exec讲解
2019/01/28 PHP
js页面跳转常用的几种方式
2010/11/25 Javascript
基于jQuery中对数组进行操作的方法
2013/04/16 Javascript
JavaScript cookie的设置获取删除详解
2014/02/11 Javascript
基于jquery实现的文字向上跑动类似跑马灯的效果
2014/06/17 Javascript
不想让浏览器运行javascript脚本的方法
2015/11/20 Javascript
浅析Bootstrap组件之面板组件
2016/05/04 Javascript
基于MVC+EasyUI的web开发框架之使用云打印控件C-Lodop打印页面或套打报关运单信息
2016/08/29 Javascript
JS正则表达式之非捕获分组用法实例分析
2016/12/28 Javascript
详解webpack es6 to es5支持配置
2017/05/04 Javascript
jQuery选择器_动力节点Java学院整理
2017/07/05 jQuery
js自定义trim函数实现删除两端空格功能
2018/02/09 Javascript
webpack4.x开发环境配置详解
2018/08/04 Javascript
vue自定义tap指令及tap事件的实现
2018/09/18 Javascript
jQuery实现王者荣耀手风琴效果
2020/01/17 jQuery
Python实现求笛卡尔乘积的方法
2017/09/16 Python
Python3 实现文件批量重命名示例代码
2019/06/03 Python
Numpy与Pytorch 矩阵操作方式
2019/12/27 Python
pytorch实现保证每次运行使用的随机数都相同
2020/02/20 Python
python关于倒排列的知识点总结
2020/10/13 Python
使用CSS实现弹性视频html5案例实践
2012/12/26 HTML / CSS
全球领先美式家具品牌:Ashley爱室丽家居
2017/08/07 全球购物
斯凯奇新西兰官网:SKECHERS新西兰
2018/02/22 全球购物
银行介绍信范文
2014/01/10 职场文书
户外亲子活动策划方案
2014/02/07 职场文书
移风易俗倡议书
2014/04/15 职场文书
离婚协议书怎样才有法律效力
2014/10/10 职场文书
个人股份转让协议书范本
2014/10/26 职场文书
2015年幼儿园大班工作总结
2015/04/25 职场文书
2015年度物流工作总结
2015/04/30 职场文书
入党群众意见范文
2015/06/02 职场文书
2016暑期政治学习心得体会
2016/01/23 职场文书
用golang如何替换某个文件中的字符串
2021/04/25 Golang
新手初学Java List 接口
2021/07/07 Java/Android