js中的几种继承方法
JS作为面向对象的弱类型语言,继承也是其非常强大的特性之一。
继承:子承父业;一个原本没有某些方法或属性的对象,统一写方法,拿到了另外一个对象的属性和方法
下面是js中的几种继承方式
1.改变this指向继承(构造函数继承):继承构造函数中的属性和方法
function Parent(n){
this.name = n;
this.skill = function(){
console.log(this.name + "是篮球运动员"); //樱木花道是篮球运动员
//泽北荣治是篮球运动员
}
}
Parent.prototype.init = function(){
console.log(123) //123
}
// function P2(){
// this.a = 10;
// }
// function P3(){
// this.b = 20;
// }
// function P4(){
// this.c = 30;
// }
function Child(n){
// Parent.bind(this,n)();
// P2.bind(this)()
// P3.bind(this)()
// P4.bind(this)()
// Parent.call(this,n);
Parent.apply(this,arguments);
}
var p = new Parent("樱木花道");
console.log(p)
p.skill(); //
p.init()
var c = new Child("泽北荣治");
console.log(c)
c.skill(); //
// console.log(c.a)
// console.log(c.b)
// console.log(c.c)
// c.init()
优点:简单方便易操作,可以多继承
缺点:只能继承构造函数,不能继承原型
2.原型对象继承:继承原型
function Parent(n){
this.name = n;
}
Parent.prototype.skill = function(){
console.log(this.name + "是鉴定师"); //大老王是鉴定师
//小老王是鉴定师
}
function Child(n){
this.name = n;
}
// 注意:对象的深浅拷贝
for(var i in Parent.prototype){
Child.prototype[i] = Parent.prototype[i];
}
var p = new Parent("大老王");
console.log(p) //Parent {name: "大老王"}
p.skill();
var c = new Child("小老王");
console.log(c) //Child {name: "小老王"}
c.skill();
优点:简单,方便,可以继承原型身上的方式和属性
缺单:只能继承原型,不方便传参
3.原型链继承:通过给Child设置原型为Parent的实例的方式,给Child添加了一层原型链的方式
function Parent(n){
this.name = n;
}
Parent.prototype.skill = function(){
console.log(this.name + "是鉴定师"); //大老王是鉴定师
}
function Child(){}
Child.prototype = new Parent("小老王");
Child.prototype.skill = function(){
console.log(this.name+"是运动员") //小老王是运动员
}
var p = new Parent("大老王");
console.log(p) //Parent {name: "大老王"}
p.skill();
// p是实例(对象),有__proto__属性,指向Parent.prototype
var c = new Child();
console.log(c); //Child {}
c.skill();
// c是实例(对象),有__proto__属性,指向Child.prototype,是Parent的实例(对象),有__proto__属性,指向Parent.prototype
优点:既能继承原型,又能继承构造函数
缺点:复杂,不方便传参
4.混合继承:构造函数继承+原型对象继承
function Parent(n){
this.name = n;
}
Parent.prototype.skill = function(){
console.log(this.name + "是鉴定师"); //大老王是鉴定师
}
function P2(){
this.a = 10;
}
P2.prototype.init = function(){
console.log("hello") //hello
}
function Child(n){
Parent.call(this,n)
P2.call(this)
}
for(var i in Parent.prototype){
Child.prototype[i] = Parent.prototype[i]
}
for(var i in P2.prototype){
Child.prototype[i] = P2.prototype[i]
}
Child.prototype.skill = function(){
console.log(123) //123
}
var p = new Parent("大老王");
console.log(p) //Parent {name: "大老王"}
p.skill();
var c = new Child("小老王");
console.log(c) //Child {name: "小老王", a: 10}
c.skill();
c.init();
优点:既能继承构造函数又能继承原型,方便传参,多继承
缺点:复杂
常用的继承方式之一
5.ES6的class继承
class Parent{
constructor(n) {
this.name = n
}
skill(){
console.log(this.name + "是鉴定师") //大老王是鉴定师
//小老王是鉴定师
}
}
class Child extends Parent{
constructor(n){
super(n)
}
}
var p = new Parent("大老王");
console.log(p) //Parent {name: "大老王"}
p.skill();
var c = new Child("小老王"); //Child {name: "小老王"}
console.log(c)
c.skill();
优点:简单方便易操作,语法层面的继承,属性和方法都能继承,参数很好处理
缺点:兼容性
忽略兼容,常用的继承方式之一
js中的几种继承方法的更多相关文章
- js oop中的三种继承方法
JS OOP 中的三种继承方法: 很多读者关于js opp的继承比较模糊,本文总结了oop中的三种继承方法,以助于读者进行区分. <继承使用一个子类继承另一个父类,子类可以自动拥有父类的属性和方 ...
- JS中的五种去重方法
JS中的五种去重方法 第一种方法: 第二种方法: 第三种方法: 第四种方法: 第五种方法:优化遍历数组法 思路:获取没重复的最右一值放入新数组 * 方法的实现代码相当酷炫,* 实现思路:获取没重复的 ...
- JS中的两种刷新方法以及区别和适用范围
在项目中有一个人信息修改的页面,但是修改后显示的却是修改之前的内容,分析问题后发现查询语句写在了修改语句之前,有些某些需要又必须这么写,但是修改信息后先却显示之前的信息也太不科学了. 所以我就想用js ...
- 事件委托,js中的一种优化方法
在前端编程中,我们常会遇到一种叫做事件委托的方法. 那么, 什么是事件委托呢? 简单来说,事件就是指onclick,onmouseover,onmouseout等大部分事件,为什么说是大部分后面会提到 ...
- JS中常见的几种继承方法
1.原型链继承 // 1.原型链继承 /* 缺点:所有属性被共享,而且不能传递参数 */ function Person(name,age){ this.name = name this.age = ...
- js中的原型、继承的一些想法
最近看到一个别人写的js类库,突然对js中的原型及继承产生了一些想法,之前也看过其中的一些内容,但是总不是很清晰,这几天利用空闲时间,对这块理解了一下,感觉还是有不通之处,思路上没那么条理,仅作为分享 ...
- 判断js中各种数据的类型方法之typeof与0bject.prototype.toString讲解
提醒大家,Object.prototype.toString().call(param)返回的[object class]中class首字母是大写,像JSON这种甚至都是大写,所以,大家判断的时候可以 ...
- 详解js中的寄生组合式继承
寄生组合式继承是js中最理想的继承方式, 最大限度的节省了内存空间. js中的寄生组合式继承要求是: 1.子对象有父对象属性的副本, 且这些不应该保存在子对象的prototype上. 2. ...
- JavaScript -- 时光流逝(三):js中的 String 对象的方法
JavaScript -- 知识点回顾篇(三):js中的 String 对象的方法 (1) anchor(): 创建 HTML 锚. <script type="text/javasc ...
随机推荐
- django在启动时抛出Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试 解决办法
1.适用场景 在启动某个服务的时候,比如python中django启动的时候8000端口被占用,导致无法启动服务. 2.解决办法 通过命令行找出端口对应的PID进程 C:\Users\micha> ...
- 【JS档案揭秘】第二集 Event loop与执行栈
我时常在思考关于JS的很多知识在工作中有什么用?是否只能存在于面试这种理论性的东西中,对于我们的业务和工作,它们又能扮演怎样的角色.以后在JS档案揭秘的每一期里,都会加入我对于业务的思考,让这些知识不 ...
- 写个shell脚本搭载jenkins让你的程序部署飞起来
[转载请注明]: 原文出处:https://www.cnblogs.com/jstarseven/p/11399251.html 作者:jstarseven 码字挺辛苦的..... 说明 ...
- 企查查app新增企业数据抓取
企查查每日新增企业数据抓取尚未完成的工作: 需要自行抓包获取设备id,appid,sign等等 sign和时间戳保持一致即可 把所有的数据库.redis配置 无法自动登录,账号需要独立 redis数据 ...
- Leetcode Weekly Contest 152
退役老人现在连leetcode都不会做了 = = 今天早上做了leetcode第三题题目看错了,加上比赛中间还在调投稿的实验,一心二用直接gg 总结下教训就是 本渣现在做题连题目都看不清就开始做.开始 ...
- 逆向破解之160个CrackMe —— 025
CrackMe —— 025 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...
- HDU - 4305 - Lightning 生成树计数 + 叉积判断三点共线
HDU - 4305 题意: 比较裸的一道生成树计数问题,构造Krichhoof矩阵,求解行列式即可.但是这道题还有一个限制,就是给定的坐标中,两点连线中不能有其他的点,否则这两点就不能连接.枚举点, ...
- CodeForces - 534B-Covered Path+思路
CodeForces - 534B 题意:给定初始和末尾的速度,和最大加速度和总时间,求出走的最长路程: 我一开始以为代码写起来会很繁琐... #include <iostream> #i ...
- 天梯杯 L2-003. 月饼
L2-003. 月饼 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不 ...
- codeforces 361 D. Levko and Array(dp+二分)
题目链接:http://codeforces.com/contest/361/problem/D 题意:最多可以修改K次数字,每次修改一个数字变成任意值,C=max(a[i+1]-a[i]):求操作之 ...