浅谈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 触发事件列表 比较不错
Sep 03 Javascript
JQuery插件开发示例代码
Nov 06 Javascript
小心!AngularJS结合RequireJS做文件合并压缩的那些坑
Jan 09 Javascript
BootStrap glyphicons 字体图标实现方法
May 01 Javascript
深入理解JS继承和原型链的问题
Dec 17 Javascript
微信小程序 解析网页内容详解及实例
Feb 22 Javascript
解决linux下node.js全局模块找不到的问题
May 15 Javascript
js中自定义react数据验证组件实例详解
Oct 19 Javascript
angular4中引入echarts的方法示例
Jan 29 Javascript
在vue中使用console.log无效的解决
Aug 09 Javascript
微信小程序反编译的实现
Dec 10 Javascript
vue3中provide && inject的使用
Jul 01 Vue.js
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中var_export与var_dump的区别分析
2010/08/21 PHP
解析用PHP实现var_export的详细介绍
2013/06/20 PHP
php生成扇形比例图实例
2013/11/06 PHP
php对数组内元素进行随机调换的方法
2015/05/12 PHP
asp.net和php的区别点总结
2019/10/10 PHP
javascript document.compatMode兼容性
2010/02/23 Javascript
jquery简单实现滚动条下拉DIV固定在头部不动
2013/11/25 Javascript
js AppendChild与insertBefore用法详细对比
2013/12/16 Javascript
Angular 4依赖注入学习教程之InjectToken的使用(八)
2017/06/04 Javascript
如何封装了一个vue移动端下拉加载下一页数据的组件
2019/01/06 Javascript
基于Node.js的大文件分片上传示例
2019/06/19 Javascript
JavaScript中var的重要性实例分析
2019/07/09 Javascript
Vue 根据条件判断van-tab的显示方式
2020/08/03 Javascript
vue实现路由懒加载的3种方法示例
2020/09/01 Javascript
Python实现Linux命令xxd -i功能
2016/03/06 Python
python如何实现int函数的方法示例
2018/02/19 Python
Python实现通过继承覆盖方法示例
2018/07/02 Python
django认证系统实现自定义权限管理的方法
2018/07/16 Python
3分钟学会一个Python小技巧
2018/11/23 Python
对Python信号处理模块signal详解
2019/01/09 Python
基于wxPython的GUI实现输入对话框(2)
2019/02/27 Python
Django 过滤器汇总及自定义过滤器使用详解
2019/07/19 Python
Python 使用 prettytable 库打印表格美化输出功能
2019/12/26 Python
Python3中的f-Strings增强版字符串格式化方法
2020/03/04 Python
python def 定义函数,调用函数方式
2020/06/02 Python
Python新手学习raise用法
2020/06/03 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
2020/10/18 Python
HTML5本地存储之Database Storage应用介绍
2013/01/06 HTML / CSS
MUGLER官方网站:蒂埃里·穆勒香水
2019/11/26 全球购物
电子狗项圈:eDog Australia
2019/12/04 全球购物
css animation配合SVG制作能量流动效果
2021/03/24 HTML / CSS
幼儿园2014年度工作总结
2014/11/10 职场文书
高三物理教学反思
2016/02/20 职场文书
2016大学生诚信考试承诺书
2016/03/25 职场文书
原来实习报告是这样写的呀!
2019/07/03 职场文书
使用 Apache Dubbo 实现远程通信(微服务架构)
2022/02/12 Servers