首页 > 其他分享 >继承

继承

时间:2023-09-05 16:34:59浏览次数:23  
标签:function name 继承 Dog Animal new prototype

原型链继承

点击查看代码
function Animal() {
this.colors = ['black', 'white']
}
Animal.prototype.getColor = function() {
return this.colors
}
function Dog() {}
Dog.prototype = new Animal()
let dog1 = new Dog()
dog1.colors.push('brown')
let dog2 = new Dog()
console.log(dog2.colors) // ['black', 'white', 'brown']
原型链继承存在的问题:
  • 问题1:原型-中包含的引⽤类型属性将被所有实例共享;
  • 问题2:⼦类在实例化的时候不能给⽗类构造函数传参;

构造函数继承

点击查看代码
function Animal(name) {
this.name = name
this.getName = function() {
return this.name
}
}
function Dog(name) {
Animal.call(this, name)
}
Dog.prototype = new Animal()

借⽤构造函数实现继承解决了原型链继承的 2 个问题:引⽤类型共享问题以及传参问题。但是由于
⽅法必须定义在构造函数中,所以会导致每次创建⼦类实例都会创建⼀遍⽅法。

组合继承
组合继承结合了原型链和盗⽤构造函数,将两者的优点集中了起来。基本的思路是使⽤原型链继承
原型上的属性和⽅法,⽽通过盗⽤构造函数继承实例属性。这样既可以把⽅法定义在原型上以实现
重⽤,⼜可以让每个实例都有⾃⼰的属性。

点击查看代码
function Animal(name) {
this.name = name
this.colors = ['black', 'white']
}
Animal.prototype.getName = function() {
return this.name
}
function Dog(name, age) {
Animal.call(this, name)
this.age = age
}
Dog.prototype = new Animal()
Dog.prototype.constructor = Dog
let dog1 = new Dog('奶昔', 2)
dog1.colors.push('brown')
let dog2 = new Dog('哈⾚', 1)
console.log(dog2)
// { name: "哈⾚", colors: ["black", "white"], age: 1 }

组合寄生式继承(圣杯模式)
组合继承已经相对完善了,但还是存在问题,它的问题就是调⽤了 2 次⽗类构造函数,第⼀次是在
new Animal(),第⼆次是在 Animal.call() 这⾥。
所以解决⽅案就是不直接调⽤⽗类构造函数给⼦类原型赋值,⽽是通过创建空函数 F 获取⽗类原型
的副本。
寄⽣式组合继承写法上和组合继承基本类似,区别是如下这⾥:

点击查看代码
删除:
Dog.prototype = new Animal()
Dog.prototype.constructor = Dog

增加:
function F() {}
F.prototype = Animal.prototype
let f = new F()
f.constructor = Dog
Dog.prototype = f

使用ES6中Object.create
增加(不用增加上面那部分了):
Dog.prototype = Object.create(Animal.prototype)
Dog.prototype.constructor = Dog

ES6 class extends继承

点击查看代码
class Animal {
constructor(name) {
this.name = name
}
getName() {
return this.name
}
}
class Dog extends Animal {
constructor(name, age) {
super(name)
this.age = age
}
}

标签:function,name,继承,Dog,Animal,new,prototype
From: https://www.cnblogs.com/wan-cb/p/17680013.html

相关文章

  • Hibernate(Spring-Data)3种实体继承创建表方式指南
    文章目录引言1.Hibernate实体继承概述1.1继承的概念和作用1.2Hibernate中的实体继承方式1.3基础注解2.单表继承策略2.1概述2.2表结构设计2.3实体类映射配置3.具体类继承策略3.1概述3.2表结构设计3.3实体类映射配置4.映射超类策略(每个类一张表)4.1概述4.2表结构......
  • 继承,多态,抽象类,接口
    一,继承1,概述-多个类中存在相同的属性和行为时,把这些相同的内容提取到一个独立的类中其他类就不用在重复定义这些内容,只需要通过extends关键字继承独立的类class子类extends父类{}有了继承后,我们就可以在一个已经存在的类的基础上,继续扩展新的成员classStudent{privateStringn......
  • iOS开发Swift-8-类的继承,方法重写,构造器,枚举类型,可选类型,强制解包,可选绑定,隐式
    1.类的继承classAnimal{funcbreathe(){//...}}classCat:Animal{varhasHair=true}letcat=Cat()cat.breathe()cat.hasHaiclassSmallCat:Cat{funceat(){//...}}letsmallCat=SmallCat()smallCat.breathe(......
  • C++继承
    一、什么是继承当遇到问题时,先查看现有的类是否能解决一部分问题,如果有则继承该类,并在此基础上扩展以此解决问题,从而缩短解决问题的时间(代码复用)当遇到一个大而复杂的问题时,可以把大问题拆分成若干个不同的小问题,然后为每个小问题设计一个类来解决,最后通过继承的方式把这......
  • 继承与接口
    文章目录一、重载、重写(覆盖)与隐藏的区别二、私有继承、公有继承、保护继承三、多重继承与虚继承1、多重继承2、类型转换与多个基类3、多重继承demo:4、虚继承5、虚继承demo:四、纯虚函数和抽象类1、面试题--->纯虚函数的实现原理,为什么抽象基类不能被实例化?2、面试题--->如何阻止一......
  • 类和对象(继承)
    继承是面向对象三大特性之一继承的好处:减少重复代码语法:class 子类:继承方式  父类子类也称派生类父类也称基类比如:classA:publicBA类称为子类(派生类)B类称为父类(基类)public叫做继承方式派生类中的成员,包含两大部分一类是从基类继承过来的,一类是自己增加的成员。......
  • 使用autofac注册继承特定接口的类或接口
    publicclassMyModule:Module{///<summary>//////</summary>///<paramname="builder"></param>protectedoverridevoidLoad(ContainerBuilderbuilder){//扫描程序集中所有继承自ITransientDepend......
  • Qt开发思想探幽]QObject、模板继承和多继承
    @目录[Qt开发探幽]QObject、模板继承和多继承1.QObject为什么不允许模板继承:2.如果需要使用QObject进行多继承的话,子对象引用的父类链至多只能含有一个QObject3.如果使用模板类和QObject做多继承,编译不通过问题场景[Qt开发探幽]QObject、模板继承和多继承当我们在用Qt开发一个......
  • hibernate——继承关系以及三个subclass标签的区别
    Java类中有继承关系,相应的在hibernate中,也有继承关系,子类反应到数据库中,就有多种实现形式了,子类和父类可以映射到同一张表中,子类也可以单独映射成一张表,但是用不同的标签实现,子类表和父类表的关系也不同。在映射文件中,有三个标签可以实现继承关系,分别是:subclass、joined-subclass、......
  • 创建多线程继承Thread和实现Runnable以及synchronized的注意事项
    关于创建多线程继承Thread和实现Runnable以及synchronized的注意事项以下是利用多线程模拟购票的代码publicclassSell{publicstaticvoidmain(String[]args){Ticketticket=newTicket();Ticketticket1=newTicket();ticket.star......