js实现的几种继承方式
他山之石,可以攻玉,本人一直以谦虚的态度学他人之所长,补自己之所短,望各位老师指正! 拜谢
js几种继承方式,学习中的总结:
所谓的继承是为了继承共有的属性,减少不必要代码的书写
第一种:借用构造函数继承 :可以继承实例属性。但是原型中的方法无法继承
// - 设置需要被继承的构造函数Animal
function Animal(name,age){
this.name = name;
this.age = age;
} Animal.prototype.eat = function(){
console.log("吃各种吃的");
}; //再设置一个猫咪构造函数 //思考:已经存在的构造函数Animal中具有了一些属性和方法,这些属性与方法时Cat构造函数需要的
// 没有必要再书写一遍了,可以使用继承的方式获取
function Cat(name,age){
//通过call的方式,修改Animal中的this指向为当前Cat的this,并设置参数
Animal.call(this,name,age);
} var c1 = new Cat("jack",);
console.log(c1);
第二种:原型继承
new Animal()
这样的语句之后执行 否则会被覆盖function Animal(name,age){
this.name = name;
this.age = age;
}
Animal.prototype.eat = function(){
console.log("吃各种吃的");
}; function Cat(color){
this.color = color;
} //继承的核心代码:
Cat.prototype = new Animal("jack",);///这点是重要点:必须写在前面 ,否则会覆盖子类的方法 //设置被覆盖的constructor属性 让constructor重新指向Cat
Cat.prototype.constructor = Cat;
Cat.prototype.shangShu = function(){
console.log("猫咪可以爬树");
};
原型链:查找规则,优先查找自身,如果没有则查找__proto__中是否存在; 原型链是用来描述实例对象与原型对象之间关系的一种方式。
第三种:组合继承
function Animal(name,age){
this.name = name;
this.age = age;
}
Animal.prototype.eat = function(){
console.log("吃各种吃的");
}; function Cat(name,age,color){
//使用借用构造函数的方式继承:
Animal.call(this,name,age);
this.color = color;
} //原型继承的核心代码:
//使用组合继承方式后,在构造函数体中就设置了实例属性,此处不需要传参
Cat.prototype = new Animal(); //设置被覆盖的constructor属性
Cat.prototype.constructor = Cat;
Cat.prototype.shangShu = function(){
console.log("猫咪可以爬树");
}; var c1 = new Cat("rose",,"red");
console.log(c1);
在这总结一下原型链: 原型链:查找规则,优先查找自身,如果没有则查找__proto__中是否存在; 原型链是用来描述实例对象与原型对象之间关系的一种方式
①Animal构造函数在设置时没用继承自其它的构造函数
②Animal的原型对象也是一个对象
③对象都是通过Object这个构造函数创建的
④Animal.prototype这个对象__proto__就应该指向Object.prototype
⑤通过观察我们发现确实含有一个属性constructor,并且值为Object构造函数
⑥Object.prototype中没有__proto__属性了,说明这个对象是原型对象的终点。若果使用一个对象的属性时,在整个原型对象中均没找到,值即为undefined Object。prototype.__proto__打印为null
扩展:在作用域中,都没有找到会报错
第四种:对组合继承的优化方式
个人认为:
function Animal(name,age){
this.name = name;
this.age = age;
}
Animal.prototype.eat = function(){
console.log("吃各种吃的");
}; function Cat(name,age,color){
//使用借用构造函数的方式继承:
Animal.call(this,name,age);
this.color = color;
} //原型继承方式中希望获取到Animal的原型方法
//Cat.prototype = new Animal(); //可以省去不需要继承的实例属性
//这种方式的确会比组合继承的方式性能更好,但是略麻烦(了解即可)
function Fun (){}
Fun.prototype = Animal.prototype;
Cat.prototype = new Fun(); Cat.prototype.constructor = Cat;
Cat.prototype.shangShu = function(){
console.log("猫咪可以爬树");
}; var c1 = new Cat("rose",,"red");
console.log(c1);
第五种:拷贝继承
function Animal(name,age){
this.name = name;
this.age = age;
}
Animal.prototype.eat = function(){
console.log("吃各种吃的");
};
//核心代码
补充一下:对象之间的继承:
var obj={
name:'jack',
age:,
gender:'男',
sayHai:function(){
console.log(‘我是人)
}
}
问题:obj2想要继承obj的属性
)拷贝继承:
var obj2={};
for(var k in obj){
obj2[k]=obj[k];
}
)原型继承:
function Fun(){};
Fun.prototype=obj;
var obj2=new Fun();
console.log(obj2);
js实现的几种继承方式的更多相关文章
- js常见的几种继承方式
1.原型链继承 “父类”的实例作为子类的prototype SubType.prototype = new SuperType() 2.组合继承(原型链+构造函数) function SubType( ...
- js中的几种继承方法
JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一. 继承:子承父业:一个原本没有某些方法或属性的对象,统一写方法,拿到了另外一个对象的属性和方法 下面是js中的几种继承方式 1.改变this ...
- js的三种继承方式及其优缺点
[转] 第一种,prototype的方式: //父类 function person(){ this.hair = 'black'; this.eye = 'black'; this.skin = ' ...
- 重新理解JS的6种继承方式
写在前面 一直不喜欢JS的OOP,在学习阶段好像也用不到,总觉得JS的OOP不伦不类的,可能是因为先接触了Java,所以对JS的OO部分有些抵触. 偏见归偏见,既然面试官问到了JS的OOP,那么说明这 ...
- js的6种继承方式
重新理解js的6种继承方式 注:本文引用于http://www.cnblogs.com/ayqy/p/4471638.html 重点看第三点 组合继承(最常用) 写在前面 一直不喜欢JS的OOP,在学 ...
- js的5种继承方式——前端面试
js主要有以下几种继承方式:对象冒充,call()方法,apply()方法,原型链继承以及混合方式.下面就每种方法就代码讲解具体的继承是怎么实现的. 1.继承第一种方式:对象冒充 function P ...
- 细说 js 的7种继承方式
在这之前,先搞清楚下面这个问题: function Father(){} Father.prototype.name = 'father'; Father.prototype.children = [ ...
- JavaScript_几种继承方式(2017-07-04)
原型链继承 核心: 将父类的实例作为子类的原型 //父类 function SuperType() { this.property = true; } SuperType.prototype.ge ...
- 都0202年了,你还不知道javascript有几种继承方式?
前言 当面试官问你:你了解js哪些继承方式?es6的class继承是如何实现的?你心中有很清晰的答案吗?如果没有的话,可以通过阅读本文,帮助你更深刻地理解js的所有继承方式. js ...
随机推荐
- yii中缓存(cache)详解 - 彼岸あ年華ツ
缓存是用于提升网站性能的一种即简单又有效的途径.通过存储相对静态的数据至缓存以备所需,我们可以省去生成 这些数据的时间.在 Yii 中使用缓存主要包括配置和访问缓存组件 . 内部方法 一.缓存配置: ...
- dede tag标签静态化
看回那2个文件夹即可,txt说明书我已经修改过. 下面说一下tag标签静态化之后在内容页.列表页中如何使用. 内容页中沿用之前的方法即可: {dede:tag sort='new' getall='0 ...
- springcloud -- sleuth+zipkin整合rabbitMQ详解
为什么使用RabbitMQ? 我们已经知道,zipkin的原理是服务之间的调用关系会通过HTTP方式上报到zipkin-server端,然后我们再通过zipkin-ui去调用查看追踪服务之间的调用链路 ...
- FFmpeg(四) 像素转换相关函数理解
一.基本流程 1.sws_getCachedContext();//得到像素转换的上下文 2.sws_scale()://进行转换 二.函数说明 1.SwsContext *vctx = NULL; ...
- Tomcat7.0.40注册到服务启动报错error Code 1 +connector attribute sslcertificateFile must be defined when using ssl with apr
Tomcat7.0.40 注册到服务启动遇到以下几个问题: 1.启动报错errorCode1 查看日志如下图: 解决办法: 这个是因为我的jdk版本问题,因为电脑是64位,安装的jdk是32位的所以会 ...
- js中的toString和valueOf
数据的转换 基本上,所有JS数据类型都拥有valueOf和toString这两个方法,null除外.它们俩解决javascript值运算与显示的问题 所有对象继承了两个转换方法: 第一个是toStri ...
- UVa12105 越大越好
题文:https://vjudge.net/problem/12364(或者见紫书) 题解: 因为题目中有两个限制条件,那么我们就顺着题目的意思来dp,设dp[i][j]表示目前还剩下的i个火柴,用这 ...
- MySQL复制从库建立-xtracebackup方式
Percona XtraBackup工具提供了一种在系统运行时执行MySQL数据热备份的方法. Percona XtraBackup在事务系统上执行联机非阻塞,紧密压缩,高度安全的完整备份,因此在计划 ...
- Java总结---继承(不断完善ing..)
java三大特性:封装.继承.多态 继承 一.目的:实现代码的复用 二.简单例子(A继承了C): public class A extends C { //检测哪些可以在子类里使用 public vo ...
- Flask中多APP应用以及admin后台系统
一.多APP from werkzeug.wsgi import DispatcherMiddleware from werkzeug.serving import run_simple from f ...