首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

JS进阶:继承

在理解继承之前,需要知道 js 的三个东西: 什么是 JS 原型链 this 的值到底是什么 JS 的new 到底是干什么的 一、什么是 JS 原型链 我们知道 JS 有对象,比如 var obj =...当我们「读取」 obj.toString 时,JS 引擎会做下面的事情: 看看 obj 对象本身有没有 toString 属性。没有就走到下一步。 看看 obj....如果你的函数调用不是 call 形式, 请将其转换为 call 形式 三、JS 的 new 到底是干什么的?...缺点: 只能继承父类的实例属性和方法,不能继承原型属性/方法 无法实现复用,每个子类都有父类实例函数的副本,影响性能 3、组合继承 组合上述两种方法就是组合继承。...用原型链实现对原型属性和方法的继承,用借用构造函数技术来实现实例属性的继承

4.4K10

js实现继承

js实现继承 经典继承(原型链) 缺点:过多的继承了没用的属性 Grandfather.prototype.lastName = 'zhang' function Grandfather() {...father function Son() { this.hobby = 'game' } var son = new Son() console.log(son); ​ son只想要继承...grandfather的lastName属性,但是由于原型链的关系,造成了son既会继承grandfather自神的东西,grandfather的原型的东西,father自身的东西和father原型上的东西...,造成了不必要的继承 共享原型 本质:重写原型对象 优点:只会继承父的原型,不会继承父原本自带的属性或方法(只有调用new Father()才会继承自身的东西) 缺点:给本身的原型添加属性或方法时,会把继承的那个原型也修改了...) 雏形 本质:重写原型对象 优点:只会继承父的原型,不会继承父原本自带的属性或方法(只有调用new Father()才会继承自身的东西) 缺点:1,这样继承后即使修改了son的原型也不会修改father

5.3K20

JS原型继承和类式继承

类式继承(构造函数) JS中其实是没有类的概念的,所谓的类也是模拟出来的。特别是当我们是用new 关键字的时候,就使得“类”的概念就越像其他语言中的类了。...function father() { this.a = 'father' } father.prototype.b = function() { alert(this.a)...它本身是一个对象,有自身属性,同时在其__proto__熟悉上也有b方法。在__proto__的后面有father,可以看出原型是自father来的。 ?...可以看到,用create的方法构造出来的对象,a属性和b方法都是在对象的原型上,也就是说我们可以通过更改father的属性动态改变obj的原型上的方法和属性,而上面通过new关键字用构造函数生成的实例,...从这里,我们也可以看到类继承和原型基础的一些区别。 结论 原型继承比较符合js这种语言的特点。因为它本身就是js强大的原型的一部分。

3.4K90

JS继承机制总结

JS继承机制总结 继承就是子类可以使用父类的所有功能,并且对这些功能进行扩展。 JS继承机制主要为原型链继承、构造函数继承、组合继承、寄生继承、寄生组合继承、原型式继承和混合式继承。...,实现多继承,创建子类实例时,可以向父类传递参数 缺点 只能继承父类实例上的属性与方法,无法继承父类原型上的属性与方法。...缺点 一些引用数据操作的时候会出问题,两个实例会公用继承实例的引用数据类 谨慎定义方法,以免定义方法也继承对象原型的方法重名 无法直接给父级构造函数使用参数 寄生式继承 继承规则 //寄生式继承也没啥东西的...缺点 一些引用数据操作的时候会出问题,两个实例会公用继承实例的引用数据类 谨慎定义方法,以免定义方法也继承对象原型的方法重名 无法直接给父级构造函数使用参数 混合式继承 继承规则 //这个**混入方式继承...**其实很好玩,之前我们一直都是以一个子类继承一个父类,而**混入方式继承**就是教我们如何一个子类继承多个父类的。

1.5K10

js 继承的是什么?如何实现继承

继承的含义: 继承是面向对象编程中的一个重要概念,通过继承可以使子类的实例使用在父类中定义的属性和方法。...二、 构造函数继承 针对前面原型链继承可能会存在公用一个原型链的问题,那么我们可以给大家介绍一种方式:构造函数的继承。构造函数的继承相当于将父类复制给子类。...三、 组合继承 原型链继承继承父类原型链上的属性,但是可能会存在篡改的问题;而构造函数继承不会存在篡改的问题,但是不能继承原型上面的属性。那么我们是否可以将两者进行结合呢?...五、 寄生式继承 在原型式继承的基础上面增强了对象,并返回构造函数。...六、 寄生组合式继承 前面说了这么多,每种继承方式都有自己的优点和缺点,那么是不是可以将这些继承的方式做一个合并:以他之长补己之短呢?

1.8K40

js各种继承方式汇总

js中的各种继承实现汇总 首先定义一个父类: function Animal(name) { this.name = name || '动物' this.sleep = function ()...方式) 特点: 1、子类的构造中进行父类构造的调用 优点: 1、实现了多继承,想继承哪个直接在子类构造里面call或者apply哪个就行 2、避免所有子类实例共享父类引用属性问题 3、创建子类实例时...,可以向父类传递参数 缺点: 1、没用到原型,只是单纯继承了父类的实例属性及方法 2、没继承原型上的属性及方法 3、每个子类都有父类方法属性的副本,影响性能,没有实现父类函数复用 function...(暴力继承) 特点: 1、子类的构造中强制拷贝父类原型上的属性或方法 优点: 1、可以多重继承 缺点: 1、效率较低,内存占用高 2、不能继承父类不可枚举的属性(不能用for in遍历的)...Animal) // false 组合继承(构造继承+原型链继承) 特点: 1、组合构造继承和原型链继承 优点: 1、可以继承实例属性/方法,也可以继承原型属性/方法 2、既是子类的实例,

2.2K70

Js继承的实现方式

Js继承的实现方式 继承是面向对象软件技术当中的一个概念,与多态、封装共为面向对象的三个基本特征。继承可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等。...,实例是子类的实例,也是父类的实例 子类实例可以继承父类构造函数属性和方法、父类原型属性和方法 不足 无法实现多继承 子类实例化时无法向父类的构造函数传参 所有子类实例都会共享父类的原型对象中的属性 构造函数继承...不足 实例并不是父类的实例,只是子类的实例 只继承了父类的构造函数的属性和方法,没有继承父类原型的属性和方法 每个子类都有父类实例函数的副本,拷贝了父类函数而不是引用,影响性能 实例继承 为父类实例增加成员与方法...所有子类实例都会共享父类的原型对象中的属性 组合继承 组合原型链继承和借用构造函数继承,结合了两种模式的优点,传参和复用 // 定义父类 function Parent(from){ this.name...child.say(); // child console.log(child.from); // child 特点 比较完善 不足 相对比较复杂 参考 https://www.jianshu.com/p/b76ddb68df0e

2K20

一文看懂 JS 继承

一文看懂 JS 继承 最近回顾 js 继承的时候,发现还是对一些概念不是很清晰。...这里再梳理一下 JS继承的几种主要的方式,构造函数继承、原型链继承、组合继承以及原型式继承、寄生式继承、寄生组合式继承和 ES6 的 Class: 构造函数继承 构造函数继承没有用到 prototype...constructor 谁叫你是覆盖 prototype 属性呢 组合继承 上面两者结合即成为组合继承模式,这个是结合了两者的优势,在 ES6 的 class 出现之前的常用方法,??...父类方法可以复用 return this.name } } let child = Object.create(parent) // ❌ 子类不能向父类传递参数 寄生式继承 原型式继承的基础上为子类增加属性和方法...这个是组合继承的唯一缺点,寄生组合式解决了这个问题: ? 公有的写在原型 ? 私有的写在构造函数 ? 可以向父类传递参数 ?

88220

js实现继承的几种方式

js作为一个面向对象的弱类型语言,继承也是其非常强大的特性之一。一般情况下会出现下面的6中继承方式。...无法实现多继承 来自原型对象的引用属性是所有实例共享的 创建子类实例时,无法向父类构造函数传参 2、构造继承 核心:使用父类的构造函数来增强子类实例,等于是复制父类的实例属性给子类(没用到原型) function...console.log(cat.eat("猫粮"));//此处会报错,通过构造继承的方式无法继承原型属性和方法 console.log(cat instanceof Animal); // false...) 缺点: 实例并不是父类的实例,只是子类的实例 只能继承父类的实例属性和方法,不能继承原型属性/方法 无法实现函数复用,每个子类都有父类实例函数的副本,影响性能 3、实例继承 核心:为父类实例添加新特性...) 6、寄生组合继承(推荐) 核心:通过寄生方式,砍掉父类的实例属性,这样,在调用两次父类的构造的时候,就不会初始化两次实例方法/属性,避免的组合继承的缺点 function Cat(name){

1.4K20
领券