javascript 继承实现方法


Posted in Javascript onAugust 26, 2009

下面我给出几种常用的方法:
1 .对象冒充
原理: 构造函数使用this关键字给所有属性和方法赋值, 因为构造函数只是一个函数,所以可以使ClassA的构造函数成为classB的方法,然后调用它.这样classB就会收到classA的构造函数中定义的属性和方法.例子:

function classA(name) 
{ 
this.name=name; 
this.showName=function(){alert(this.name);} 
} 
function classB(name) 
{ 
this.newMethod = classA; 
this.newMethod(name); 
} 
obj = new classA("hero"); 
objB = new classB("dby"); 
obj.showName(); // print hero 
objB.showName(); // print dby 说明classB 继承了classA的方法.

对象冒充可以实现多重继承 例如
function classz(){ 
this.newMethod = classX; 
this.newMethod(); 
delete this.newMethod; 
this.newMethod=classY; 
this.newMethod(): 
delete this.newMethod; 
}

但是如果classX和classY有相同的属性或者方法,classY具有高优先级.
2.call()方法
call方法使与经典的对象冒充法就相近的方法,它的第一个参数用作this的对象,其他参数都直接传递给函数自身.
function sayName(perfix) 
{ 
alert(perfix+this.name); 
} 
obj= new Object(); 
obj.name="hero"; 
sayName.call(obj,"hello," ); 
function classA(name) 
{ 
this.name=name; 
this.showName=function(){alert(this.name);}; 
} 
function classB(name) 
{ 
classA.call(this,name); 
} 
objB = new classB("bing"); 
objB.showName();////说明classB继承classA的showName方法

3.apply()方法
aplly()方法有2个参数,一个用作this对象,一个使传递给函数的参数数组.
function sayName(perfix) 
{ 
alert(perfix+this.name); 
} 
obj= new Object(); 
obj.name="hero"; 
sayName.aplly(obj,new Array("hello,") );

4. 原型链
prototype对象的任何属性和方法都会被传递给对应类的所有实例,原型链就是用这种方式来显现继承.
function classA (){} 
classA.prototype.name="hero"; 
classA.prototype.showName=function(){alert(this.name)} 
function classB(){} 
classB.prototype=new classA(); 
objb = new classB() 
objb.showName();//print hero 说明b继承了a的方法

这里需要注意 调用classA的构造函数时,没有给它传递参数,这是原型链的标准做法,确保函数的构造函数没有任何参数.
并且 子类的所有属性和方法,必须出现在prototype属性被赋值后,应为在它之前赋的值会被删除.因为对象的prototype属性被替换成了新对象,添加了新方法的原始对象将被销毁.

5 混和方式
就是用冒充方式 定义构造函数属性,用原型法定义对象方法.

function classA(name) 
{ 
this.name=name; 
} 
classA.prototype.showName=function(){alert(this.name)} 
function classB(name) 
{ 
classA.call(this,name); 
} 
classB.prototype = new classA(); 
classB.prototype.showName1=function(){alert(this.name+"*****");}; 
obj = new classB("hero"); 
obj.showName(); 
obj.showName1();

在classB的构造函数中通过调用call方法 继承classA中的name属性,用原型链来继承classA的showName方法.
Javascript 相关文章推荐
js跨域和ajax 跨域问题的实现思路
Sep 05 Javascript
WEB 浏览器兼容 推荐收藏
May 14 Javascript
简洁Ajax函数处理(示例代码)
Nov 15 Javascript
简单的JavaScript互斥锁分享
Feb 02 Javascript
Jquery判断radio、selelct、checkbox是否选中及获取选中值方法总结
Apr 15 Javascript
利用jQuery实现漂亮的圆形进度条倒计时插件
Sep 30 Javascript
使用Web Uploader实现多文件上传
Jun 08 Javascript
Bootstrap复选框和单选按钮美化插件(推荐)
Nov 23 Javascript
Angularjs2不同组件间的通信实例代码
May 06 Javascript
让div运动起来 js实现缓动效果
Jul 06 Javascript
Vue实现类似Spring官网图片滑动效果方法
Mar 01 Javascript
Vant Weapp组件踩坑:picker的初始赋值解决
Nov 12 Javascript
JS去除字符串的空格增强版(可以去除中间的空格)
Aug 26 #Javascript
JavaScript 获取用户客户端操作系统版本
Aug 25 #Javascript
JS 获取span标签中的值的代码 支持ie与firefox
Aug 24 #Javascript
jquery 表单进行客户端验证demo
Aug 24 #Javascript
JS 时间显示效果代码
Aug 23 #Javascript
JQuery this 和 $(this) 的区别
Aug 23 #Javascript
ext checkboxgroup 回填数据解决
Aug 21 #Javascript
You might like
php 代码优化的42条建议 推荐
2009/09/25 PHP
PHP ? EasyUI DataGrid 资料存的方式介绍
2012/11/07 PHP
ThinkPHP水印功能实现修复PNG透明水印并增加JPEG图片质量可调整
2014/11/05 PHP
分享14个很酷的jQuery导航菜单插件
2011/04/25 Javascript
js获取判断上传文件后缀名的示例代码
2014/02/19 Javascript
javascript实现iframe框架延时加载的方法
2014/10/30 Javascript
NodeJS学习笔记之Connect中间件模块(一)
2015/01/27 NodeJs
JS遍历数组和对象的区别及递归遍历对象、数组、属性的方法详解
2016/06/14 Javascript
js 将canvas生成图片保存,或直接保存一张图片的实现方法
2018/01/02 Javascript
Django+Vue实现WebSocket连接的示例代码
2019/05/28 Javascript
[27:53]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS iG
2014/05/26 DOTA
Python实现单词拼写检查
2015/04/25 Python
Python操作MongoDB详解及实例
2017/05/18 Python
基于python爬虫数据处理(详解)
2017/06/10 Python
python OpenCV学习笔记直方图反向投影的实现
2018/02/07 Python
Python基础教程之内置函数locals()和globals()用法分析
2018/03/16 Python
Python批量发送post请求的实现代码
2018/05/05 Python
使用python批量修改文件名的方法(视频合并时)
2020/03/24 Python
Tensorflow的梯度异步更新示例
2020/01/23 Python
Python基于gevent实现文件字符串查找器
2020/08/11 Python
Python使用Pygame绘制时钟
2020/11/29 Python
台湾团购、宅配和优惠券:17Life
2017/08/14 全球购物
社区庆八一活动方案
2014/02/02 职场文书
服务承诺书怎么写
2014/05/24 职场文书
船舶工程技术专业求职信
2014/08/07 职场文书
政治学专业毕业生求职信
2014/08/11 职场文书
升国旗演讲稿
2014/09/05 职场文书
公司辞职信模板
2015/05/13 职场文书
高中数学课堂教学反思
2016/02/18 职场文书
描写九月优美句子(39条)
2019/09/11 职场文书
关于React Native 无法链接模拟器的问题
2021/06/21 Javascript
Python 发送SMTP邮件的简单教程
2021/06/24 Python
CKAD认证中部署k8s并配置Calico插件
2022/03/31 Servers
Pyhton爬虫知识之正则表达式详解
2022/04/01 Python
解决springboot druid数据库连接失败后一直重连的方法
2022/04/19 Java/Android
Go web入门Go pongo2模板引擎
2022/05/20 Golang