浅谈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获取多个数组的交集简单实例
Nov 11 Javascript
Js为表单动态添加节点内容的方法
Feb 10 Javascript
原生js实现类似弹窗抖动效果
Apr 02 Javascript
jQuery实现的Div窗口震动效果实例
Aug 07 Javascript
javascript实现动态标签云
Oct 16 Javascript
js绑定事件和解绑事件
Apr 27 Javascript
Vue学习笔记进阶篇之vue-cli安装及介绍
Jul 18 Javascript
讲解vue-router之什么是动态路由
May 28 Javascript
微信小程序封装自定义弹窗的实现代码
May 08 Javascript
vuex vue简单使用知识点总结
Aug 29 Javascript
vue实现手机端省市区区域选择
Sep 27 Javascript
js实现微信聊天效果
Aug 09 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
yii框架redis结合php实现秒杀效果(实例代码)
2017/10/26 PHP
一个轻量级的javascript库 pj介绍
2010/12/19 Javascript
ASP.NET jQuery 实例2 (表单中使用回车在TextBox之间向下移动)
2012/01/13 Javascript
js实现遮罩层划出效果是生成div而不是显示
2014/07/29 Javascript
引用其它js时如何同时处理多个window.onload事件
2014/09/02 Javascript
angularjs指令中的compile与link函数详解
2014/12/06 Javascript
JS中处理时间之setUTCMinutes()方法的使用
2015/06/12 Javascript
JS控制弹出悬浮窗口(一览画面)的实例代码
2016/05/30 Javascript
JS实现直接运行html代码的方法
2017/03/13 Javascript
微信小程序实战之轮播图(3)
2017/04/17 Javascript
js求数组中全部数字可拼接出的最大整数示例代码
2017/08/25 Javascript
从源码看angular/material2 中 dialog模块的实现方法
2017/10/18 Javascript
解决Angular.js中使用Swiper插件不能滑动的问题
2018/02/26 Javascript
JavaScript设计模式之原型模式分析【ES5与ES6】
2018/07/26 Javascript
VUE注册全局组件和局部组件过程解析
2019/10/10 Javascript
Vue实现开心消消乐游戏算法
2019/10/22 Javascript
v-slot和slot、slot-scope之间相互替换实例
2020/09/04 Javascript
JavaScript实现简易计算器小功能
2020/10/22 Javascript
[01:14:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Orenda
2014/05/22 DOTA
python使用邻接矩阵构造图代码示例
2017/11/10 Python
Python中if elif else及缩进的使用简述
2018/05/31 Python
python爬取个性签名的方法
2018/06/17 Python
对pandas中Series的map函数详解
2018/07/25 Python
Python Matplotlib库安装与基本作图示例
2019/01/09 Python
通过实例解析Python调用json模块
2019/12/11 Python
python对象销毁实例(垃圾回收)
2020/01/16 Python
Jupyter Notebook 文件默认目录的查看以及更改步骤
2020/04/14 Python
HTML5 Web 存储详解
2016/09/16 HTML / CSS
高职教师岗位职责
2013/12/24 职场文书
工业学校毕业生自荐书
2014/01/03 职场文书
毕业生就业协议书
2014/04/11 职场文书
离婚协议书应该怎么写
2014/10/12 职场文书
2014年发展党员工作总结
2014/11/12 职场文书
白银帝国观后感
2015/06/17 职场文书
幼儿园老师新年寄语
2015/08/17 职场文书
创业计划书之香辣虾火锅
2019/09/23 职场文书