浅谈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 动态添加表格行
Jun 22 Javascript
用js实现下载远程文件并保存在本地的脚本
May 06 Javascript
IE中radio 或checkbox的checked属性初始状态下不能选中显示问题
Jul 25 Javascript
javascript 获取表单file全路径
Dec 31 Javascript
jquery实现聚光灯效果的方法
Feb 06 Javascript
浅谈Sticky组件的改进实现
Mar 22 Javascript
移动端jQuery修正Web页面滑动时div问题的两则实例
May 30 Javascript
JavaScript面试开发常用的知识点总结
Aug 08 Javascript
jquery  实现轮播图详解及实例代码
Oct 12 Javascript
AngularJS实现表单验证功能
Jan 09 Javascript
详解Javascript 中的 class、构造函数、工厂函数
Dec 20 Javascript
vue.js绑定事件监听器示例【基于v-on事件绑定】
Jul 07 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分页函数
2006/10/09 PHP
基于PHP文件操作的详解
2013/06/05 PHP
360通用php防护代码(使用操作详解)
2013/06/18 PHP
php ci框架验证码实例分析
2013/06/26 PHP
PHP中常用的字符串格式化函数总结
2014/11/19 PHP
PHP保存带BOM文件的方法
2015/02/12 PHP
PHP处理bmp格式图片的方法分析
2017/07/04 PHP
jquery text,radio,checkbox,select操作实现代码
2009/07/09 Javascript
让ie运行js时提示允许阻止内容运行的解决方法
2010/10/24 Javascript
点击表单提交时出现jQuery没有权限的解决方法
2014/07/23 Javascript
ie8下修改input的type属性报错的解决方法
2014/09/16 Javascript
使用RequireJS库加载JavaScript模块的实例教程
2016/06/06 Javascript
微信小程序开发之map地图实现教程
2017/06/08 Javascript
解决jquery appaend元素中id绑定事件失效的问题
2017/09/12 jQuery
vue2里面ref的具体使用方法
2017/10/27 Javascript
Vue中div contenteditable 的光标定位方法
2018/08/25 Javascript
Angular6 Filter实现页面搜索的示例代码
2018/12/02 Javascript
vue自定义指令实现方法详解
2019/02/11 Javascript
Node.JS如何实现JWT原理
2020/09/18 Javascript
Python查询Mysql时返回字典结构的代码
2012/06/18 Python
Python获取远程文件大小的函数代码分享
2014/05/13 Python
python变量不能以数字打头详解
2016/07/06 Python
Python使用Turtle模块绘制五星红旗代码示例
2017/12/11 Python
kaggle+mnist实现手写字体识别
2018/07/26 Python
python 列表中[ ]中冒号‘:’的作用
2019/04/30 Python
tensorflow 重置/清除计算图的实现
2020/01/19 Python
基于python3生成标签云代码解析
2020/02/18 Python
基于python和flask实现http接口过程解析
2020/06/15 Python
CSS3与动画有关的属性transition、animation、transform对比(史上最全版)
2017/08/18 HTML / CSS
婚假请假条格式及范文
2014/04/10 职场文书
槐乡的孩子教学反思
2014/04/27 职场文书
敬老院标语
2014/06/27 职场文书
男性健康日的活动方案
2014/08/18 职场文书
励志演讲稿500字
2014/08/21 职场文书
离婚起诉状范本
2015/05/19 职场文书
小爸爸观后感
2015/06/15 职场文书