Javascript 类继承
Js继承
JavaScript并不是真正面向对象的语言,是基于对象的,没有类的概念。
要想实现继承,可以用js的原型prototype机制或者用apply和call方法去实现
/**
声明一个基础父类
*/
function Hero(name,skill){
this.name = name?name:'';
this.skill = skill?skill:'';
}
Hero.prototype.sayHello = function(){
console.log(this.name + ";" + this.skill);
}
//类静态常量
Hero.type = "I'm Hero";
//类静态方法
Hero.doSomething = function(){
console.log('doSomething');
}
子类的定义
1. 使用prototype继承
优缺点
- 该方法能继承父类的属性,方法
- 若父类构造器有参数,无法向父构造器传参数·
- 若父类原型进行了修改会影响到子类实例
- 构造函数的静态常量不能继承到
实现方法:
- 把父类的实例付给子类的原型 Children.prototype = new Parent();
- 要添加
Children.prototype.constructor = Children语句 使 构造函数 等于 原型的constructor
function CNHero(era){
this.era = era;
}
CNHero.prototype = new Hero();
//使构造函数 等于 原型的constructor
CNHero.prototype.constructor = CNHero;
//类静态常量/方法不会继承 需要自己声明
CNHero.type = "I'm CNHero";
var cnHero = new CNHero('三国时代');
//以下属性均是来自父类的(__poro__)
cnHero.name;// =>'' 继承了父类的属性
cnHero.skill;// =>''
//给该属性设值,该属性会在实例下面创建,不会改变__poro__下的值
cnHero.name = 'CNHero:诸葛亮';
cnHero.skill = '东风计';
cnHero.sayHello();//=>诸葛亮;东风计;I'm CNHero
//若父类原型进行了修改会影响到子类实例 与原来父类的原型链相互影响 CNHero - > new Hero - > Hero.prototype
cnHero.change;//=>undefined
Hero.prototype.change = 'change';
cnHero.change;//=>change
2. 使用apply,call继承(构造器继承)
- 在构造函数中调用父类的构造函数(创建子类就能够传入需要的属性)
- 该方法能继承 父类的属性(即父类构造器里面的方法,属性)
- 不能继承父类的原型方法,原型属性
- 相当于把父类的属性方法拷贝到子类(消耗会变大)
- 构造函数的静态常量不能继承到
function CNHero(name,skill,era){
Hero.call(this,name,skill); // <=>Hero.apply(this,[]);
this.era = era;
}
//类静态常量/方法不会继承 需要自己声明
CNHero.type = "I'm CNHero";
var hero = new CNHero('诸葛亮','72计','三国时代');
console.log(hero.type); //=>I'm Hero
try{
hero.sayHello(); //=>继承不了父类原型的方法
}catch(e){
console.log(e); //=> hero.sayHello is not a function
}
3.prototype,call/apply组合使用 (组合继承)
- 该方法能继承 父类的属性,方法
- 可调用父类的构造函数
- 会初始化父类两次 ,出现属性重复(子类以及原型有重复属性)
- 构造函数的静态常量不能继承到
//1.使用call方法调用父类构造函数
function CNHero(name,skill,era){
Hero.call(this,name,skill); // <=>Hero.apply(this,[]);
this.era = era;
}
//改变prototype的指向
CNHero.prototype = new Hero();
//使 构造函数 等于 原型的constructor
CNHero.prototype.constructor = CNHero;
//类静态常量/方法不会继承 需要自己声明
CNHero.type = "I'm CNHero";
var hero = new CNHero('诸葛亮','东风计');
hero.sayHello(); //=>诸葛亮;东风计;I'm CNHero
4. 寄生继承
- 组合继承的改进方法,可以避免属性重复的问题
- 构造函数的静态常量不能继承到
function CNHero(name,skill,era){
Hero.call(this,name,skill); // <=>Hero.apply(this,[name,skill]);
this.era = era;
}
//闭包,不影响外面的执行
(function(){
// 创建一个间接类 并 将父类的原型赋值给间接类 这样能够避免将父类的属性添加到子类
var Super = function(){};
Super.prototype = Hero.prototype;
//将实例作为子类的原型
CNHero.prototype = new Super();
}());
//使 构造函数 等于 原型的constructor
CNHero.prototype.constructor = CNHero;
//类静态常量/方法不会继承 需要自己声明
CNHero.type = "I'm CNHero";
var hero = new CNHero('诸葛亮','东风计','三国时代');
hero.sayHello(); //=>诸葛亮;东风计;I'm CNHero
Javascript 类继承的更多相关文章
- JavaScript类继承, 用什么方法好
JavaScript类继承, 用什么方法好 一个实例: 基类Car: function Car(color, year) { this.name = "car"; this.col ...
- Javascript类继承-机制-代码Demo【原创】
最近看到<Javascript设计模式>,对js模拟的”继承方式“有了更深一步的了解,虽然之前也总是用到prototype.new ,但只是知其然不知所以然,现在将类继承的方法整理如下,暂 ...
- javascript类继承的一些实验
其实一开始编js没怎么用过对象,一般都用func,func,func···但是用多了,感觉代码一点都不美观,还要这里包一个函数,那里包一个函数,或者一直都是函数调用,不好看,而且一些重用的都要重写的话 ...
- JavaScript类继承
和其他功能一样,ECMAScript 实现继承的方式不止一种.这是因为 JavaScript 中的继承机制并不是明确规定的,而是通过模仿实现的.这意味着所有的继承细节并非完全由解释程序处理.作为开发者 ...
- javascript类继承系列五(其他方式继承)
除了前面学习的三种继承外,还有另外三种:原型继承寄生继承,寄生组合继承都是以: function object(o) { function F() { } F.prototype = o; retur ...
- javascript类继承系列二(原型链)
原型链是采用最主要的继承方式,原理:每一个类(构造器,js中的function)都有一个原型属性(prototype)指向一个原型对象,原型对象有一个构造器(constructor),它又指回到fun ...
- javascript类继承系列四(组合继承)
原理: 结合了原型链和对象伪装各自优点的方式,基本思路是:使用原型链继承原型上的属性和方法,使用对象伪装继承实例属性,通过定义原型方法,允许函数复用,并运行每个实例拥有自己的属性 function B ...
- javascript类继承系列三(对象伪装)
原理:在子类的构造器上调用超类构造器(父类构造器中的this指向子类实例),js提供了apply()和call()函数,可以实现这种调用 function baseClass() { this.col ...
- javascript类继承系列一
js中没有提供类(class,抽象类,接口等高级的抽象),可以用new,但new的function的对象,构造器 但在js中可以通过function来模拟类的一些特性function fun_name ...
随机推荐
- angular.js的ui-router总结
ui-route 先有个网址,再在这个网址下写路由 子路由的搭建 我们的布局/模板文件 index.html 我们通过建立一个主文件来引入我们所需要的所有资源以开始我们的项目 ,这里 ...
- jt格式文件与网格压缩
jt格式文件与网格压缩 介绍 jt是一种3D数据格式,主要用于工业,产品可视化,数据交换,并且西门子在2012推动jt成为ISO国际标准.在文件尺寸方面,采用了不少专门的压缩方法,比较轻量化. jt文 ...
- SQL优化一
1.行列转换: decode(条件,值1,返回值1,值2,返回值2,...值n,返回值n,缺省值); select decode(sign(变量1-变量2),-1,变量1,变量2) from dual ...
- Maven学习(三)
maven相关概念 maven坐标 Maven世界拥有大量构建,当我们需要引用依赖包是,需要用一个用来唯一标识去确定唯一的一个构建.如果拥有了统一规范,就可以把查找工作交给机器. 类似于空间找点的坐标 ...
- MySql学习笔记(五) —— 存储过程
存储过程是MySql 5支持的特性,它是一组为了完成特定功能的SQL语句集,经过编译之后存储在数据库中,当需要使用该组SQL语句时用户只需要通过指定储存过程的名字并给定参数就可以调用执行它了,简而言之 ...
- 关于bootstrap中cropper的截图上传问题
之前做一个关于截图的东东,搞了好久终于弄好了,其主要关键是把前端截图的数据(x坐标,y坐标,宽度,高度和旋转角度)传到后台,然后在后台对图片做相关处理,记录一下方便以后查看. 后台配置为ssm. Ja ...
- [转]tomcat部署(1)
阅读目录 1 目录结构 2 部署 3 发布 4 测试 本篇参考Tomcat官方文档:<First Webapp>翻译,并结合自己的开发经验介绍关于tomcat部署以及发布的相关内容. ...
- a标签点击之后有个虚线边框,怎么去掉
1.行内处理方式1 <a hidefocus="true" href="#"></a> 2.行内处理方式2,让a标签获得焦点就失去焦点, ...
- Android界面(1) 使用TextView实现跑马灯效果
方法一:(只能实现单个TextView的跑马灯效果)在TextView添加以下控件 android:singleLine="true"只能单行,超出的文字显示为"...& ...
- 一周一个小demo — 前端后台的交互实例
这一周呢,本K在大神的指导下,完成了一个利用ajax与php文件上传处理相结合的一个留言板功能的小实例,下面就让本K来带大家瞅瞅如何实现这一种功能. 一.界面概览 首先我们来看一下这个小demo的具体 ...