浅谈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中与toggleClass等价的程序段 以及未来学习的方向
Mar 18 Javascript
js鼠标点击事件在各个浏览器中的写法及Event对象属性介绍
Jan 24 Javascript
JS阻止冒泡事件以及默认事件发生的简单方法
Jan 17 Javascript
Ajax跨域实现代码(后台jsp)
Jan 21 Javascript
bootstrap datetimepicker日期插件超详细使用方法介绍
Feb 23 Javascript
js中编码函数:escape,encodeURI与encodeURIComponent详解
Mar 21 Javascript
JS 验证密码 不能为空,必须含有数字、字母、特殊字符,长度在8-12位
Jun 21 Javascript
javascript用rem来做响应式开发
Jan 13 Javascript
JavaScript折半查找(二分查找)算法原理与实现方法示例
Aug 06 Javascript
js中的reduce()函数讲解
Jan 18 Javascript
vue无限轮播插件代码实例
May 10 Javascript
在antd Table中插入可编辑的单元格实例
Oct 28 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中判断变量为空的几种方法小结
2013/11/12 PHP
用PHP的socket实现客户端到服务端的通信实例详解
2017/02/04 PHP
PHP实现基于图的深度优先遍历输出1,2,3...n的全排列功能
2017/11/10 PHP
PHP getDocNamespaces()函数讲解
2019/02/03 PHP
PHP操作XML中XPath的应用示例
2019/07/04 PHP
JavaScript 未结束的字符串常量常见解决方法
2010/01/24 Javascript
单击复制文字兼容各浏览器的完美解决方案
2013/07/04 Javascript
使用jQuery实现更改默认alert框体
2015/04/13 Javascript
js随机生成字母数字组合的字符串 随机动画数字
2015/09/02 Javascript
用原生JS对AJAX做简单封装的实例代码
2016/07/13 Javascript
AngularJS表格详解及示例代码
2016/08/17 Javascript
jquery日历插件e-calendar升级版
2016/11/10 Javascript
原生js实现轮播图的示例代码
2017/02/20 Javascript
Vue框架中正确引入JS库的方法介绍
2017/07/30 Javascript
Vue中对iframe实现keep alive无刷新的方法
2019/07/23 Javascript
vux-scroller实现移动端上拉加载功能过程解析
2019/10/08 Javascript
node.JS二进制操作模块buffer对象使用方法详解
2020/02/06 Javascript
Python模块学习 datetime介绍
2012/08/27 Python
python抓取京东商城手机列表url实例代码
2013/12/18 Python
python实现ftp客户端示例分享
2014/02/17 Python
Python判断字符串与大小写转换
2015/06/08 Python
详解Python中使用base64模块来处理base64编码的方法
2016/07/01 Python
python dict 字典 以及 赋值 引用的一些实例(详解)
2017/01/20 Python
教你用 Python 实现微信跳一跳(Mac+iOS版)
2018/01/04 Python
python 显示数组全部元素的方法
2018/04/19 Python
Python3.5实现的罗马数字转换成整数功能示例
2019/02/25 Python
Python3实现的旋转矩阵图像算法示例
2019/04/03 Python
python进程池实现的多进程文件夹copy器完整示例
2019/11/27 Python
解决Pycharm双击图标启动不了的问题(JetBrains全家桶通用)
2020/08/07 Python
python 8种必备的gui库
2020/08/27 Python
基于 Python 实践感知器分类算法
2021/01/07 Python
香港优质食材和美酒专门店:FoodWise
2017/09/01 全球购物
环境科学专业研究生求职信
2013/10/02 职场文书
学校做一个有道德的人活动方案
2014/08/23 职场文书
2015年社区居委会工作总结
2015/05/18 职场文书
使用nginx配置访问wgcloud的方法
2021/06/26 Servers