浅谈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 添加和移除函数的通用方法
Oct 20 Javascript
javascript call方法使用说明
Jan 11 Javascript
js或jquery实现页面打印可局部打印
Mar 27 Javascript
javascript基础知识
Jun 07 Javascript
JS作用域闭包、预解释和this关键字综合实例解析
Dec 16 Javascript
AngularJS中$http的交互问题
Mar 29 Javascript
canvas简单快速的实现知乎登录页背景效果
May 08 Javascript
node使用UEditor富文本编辑器的方法实例
Jul 11 Javascript
elementUI同一页面展示多个Dialog的实现
Nov 19 Javascript
微信小程序学习之自定义滚动弹窗
Dec 20 Javascript
详解如何使用Node.js实现热重载页面
May 06 Javascript
帮你提高开发效率的JavaScript20个技巧
Jun 18 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获取MAC地址的函数代码
2011/09/11 PHP
2014过年倒计时示例
2014/01/31 PHP
详解PHP导入导出CSV文件
2014/11/03 PHP
phpstorm编辑器乱码问题解决
2014/12/01 PHP
PHP中SQL查询语句的id=%d解释(推荐)
2016/12/10 PHP
php 静态属性和静态方法区别详解
2017/04/09 PHP
PHP实现的用户注册表单验证功能简单示例
2019/02/25 PHP
$.format,jquery.format 使用说明
2011/07/13 Javascript
JS无法捕获滚动条上的mouse up事件的原因猜想
2012/03/21 Javascript
html a标签-超链接中confirm方法使用介绍
2013/01/04 Javascript
JS冒泡事件的快速解决方法
2013/12/16 Javascript
jquery仅用6行代码实现滑动门效果
2015/09/07 Javascript
js实现微信分享代码
2020/10/11 Javascript
基于jQuery1.9版本如何判断浏览器版本类型
2016/01/12 Javascript
JS鼠标滚动分页效果示例
2017/07/05 Javascript
浅析Javascript中双等号(==)隐性转换机制
2017/10/27 Javascript
mint-ui 时间插件使用及获取选择值的方法
2018/02/09 Javascript
JQuery使用属性addClass、removeClass和toggleClass实现增加和删除类操作示例
2019/11/18 jQuery
JS插件amCharts实现绘制柱形图默认显示数值功能示例
2019/11/26 Javascript
JS简单表单验证功能完整示例
2020/01/26 Javascript
python 基础学习第二弹 类属性和实例属性
2012/08/27 Python
python django集成cas验证系统
2014/07/14 Python
Python实现列表转换成字典数据结构的方法
2016/03/11 Python
python TKinter获取文本框内容的方法
2018/10/11 Python
BeautifulSoup获取指定class样式的div的实现
2020/12/07 Python
Python爬虫之App爬虫视频下载的实现
2020/12/08 Python
python实现xml转json文件的示例代码
2020/12/30 Python
Django 实现图片上传和下载功能
2020/12/31 Python
野兽派官方旗舰店:THE BEAST 野兽派
2016/08/05 全球购物
美国首屈一指的高品质珠宝设计师和零售商:Allurez
2018/01/23 全球购物
写自荐信的七个技巧
2013/10/15 职场文书
妇产医师自荐信
2014/01/29 职场文书
医院安全生产月活动总结
2014/07/05 职场文书
贷款委托书怎么写
2014/08/02 职场文书
小学生2015教师节演讲稿
2015/03/19 职场文书
小学班级标语口号大全
2015/12/26 职场文书