浅谈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 DOM 学习第二章 编辑文本
Feb 19 Javascript
jQuery去掉字符串起始和结尾的空格(多种方法实现)
Apr 01 Javascript
点击button获取text内容并改变样式的js实现
Sep 09 Javascript
js网页右下角提示框实例
Oct 14 Javascript
JavaScript中的普通函数与构造函数比较
Apr 07 Javascript
jQuery插件slick实现响应式移动端幻灯片图片切换特效
Apr 12 Javascript
jQuery.extend 函数及用法详细
Sep 06 Javascript
jQuery封装的屏幕居中提示信息代码
Jun 08 Javascript
JS实现简单的右下角弹出提示窗口完整实例
Jun 21 Javascript
轻松搞定js表单验证
Oct 13 Javascript
vue项目中引入noVNC远程桌面的方法
Mar 05 Javascript
微信小程序使用wx.request请求服务器json数据并渲染到页面操作示例
Mar 30 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+dojo 的数据库保存拖动布局的一个方法dojo 这里下载
2007/03/07 PHP
PHP 的ArrayAccess接口 像数组一样来访问你的PHP对象
2010/10/12 PHP
PHP 返回数组后处理方法(开户成功后弹窗提示)
2017/07/03 PHP
自己整理的一个javascript日期处理函数
2010/10/16 Javascript
JQuery 文本框回车跳到下一个文本框示例代码
2013/08/30 Javascript
jQuery实现点击文本框弹出热门标签的提示效果
2013/11/17 Javascript
js实现跨域的几种方法汇总(图片ping、JSONP和CORS)
2015/10/25 Javascript
Hammer.js+轮播原理实现简洁的滑屏功能
2016/02/02 Javascript
JS使用单链表统计英语单词出现次数
2016/06/16 Javascript
JS+CSS3模拟溢出滚动效果
2016/08/12 Javascript
EasyUI学习之Combobox下拉列表(1)
2016/12/29 Javascript
使用UrlConnection实现后台模拟http请求的简单实例
2017/01/04 Javascript
JavaScript函数中的this四种绑定形式
2017/08/15 Javascript
three.js加载obj模型的实例代码
2017/11/10 Javascript
仿淘宝JSsearch搜索下拉深度用法
2018/01/15 Javascript
浅谈vue的几种绑定变量的值 防止其改变的方法
2018/03/01 Javascript
vue中注册自定义的全局js方法
2019/11/15 Javascript
JavaScript实现省份城市的三级联动
2020/02/11 Javascript
js+html+css实现手动轮播和自动轮播
2020/12/30 Javascript
Python 实现简单的shell sed替换功能(实例讲解)
2017/09/29 Python
Python用 KNN 进行验证码识别的实现方法
2018/02/06 Python
解决新django中的path不能使用正则表达式的问题
2018/12/18 Python
pandas 如何分割字符的实现方法
2019/07/29 Python
python向图片里添加文字
2019/11/26 Python
python 爬取疫情数据的源码
2020/02/09 Python
Python运行异常管理解决方案
2020/03/09 Python
html5是什么_动力节点Java学院整理
2017/07/07 HTML / CSS
英国最大的美妆产品在线零售商之一:Beauty Bay
2017/09/29 全球购物
美国伊甸园兄弟种子公司:Eden Brothers
2018/07/01 全球购物
学雷锋标兵事迹材料
2014/08/18 职场文书
办公室主任岗位职责
2015/01/31 职场文书
餐饮店长岗位职责
2015/04/14 职场文书
Promise面试题详解之控制并发
2021/05/14 面试题
Django实现翻页的示例代码
2021/05/24 Python
HTML基本元素标签介绍
2022/02/28 HTML / CSS
Nginx中使用Lua脚本与图片的缩略图处理的实现
2022/03/18 Servers