美文网首页
javaScript对象的继承

javaScript对象的继承

作者: 番茄炒西红柿啊 | 来源:发表于2021-08-04 11:27 被阅读0次

目录:

  • 伪继承
  • 通过中间对象实现
  • ES6 class实现继承关系

1.伪继承

父类:

// 父类
function Parent(sender) {
 this.name = sender.name
}

Parent.prototype.log = function() {
 console.log('log', this.name)
}

子类:

// 子类
function Sub(sender) {
 Parent.call(this, sender)
  this.age = sender.age
}

Sub.prototype = {
  constructor: Sub,
  ...Parent.prototype
}

示例:

let sender = {name: 'diudiu', age: 18}
let s = new Sub(sender)
console.log(s)
s.log()

/// 控制台输出:
Sub { name: 'diudiu', age: 18 }
log diudiu

接着上面的代码,我们继续添加如下代码:为父类Parent再添加一个方法,并在子类s中调用

Parent.prototype.log2 = function() {
  console.log('log2', this.name)
}
s.log2()

可以看到控制台报错如下:

TypeError: s.log2 is not a function

进一步验证:

console.log(s instanceof Sub)
console.log(s instanceof Parent)

控制台输出如下:

true
false

综上所述此种方式:

优点:代码简洁。

缺点:并不是真正意义上的继承,原型链上并没有建立起继承的关系。后续如果Parent.prototype有添加新方法和属性,Sub创建的实例对象是访问不到的。

2.原型链继承

创建一个中间对象来实现继承链

父类:

// 父类
function Parent(sender) {
    this.name = sender.name
}

Parent.prototype.log = function() {
    console.log('log', this.name)
}

子类:

// 子类
function Sub(sender) {
    Parent.call(this, sender)
  this.age = sender.age
}

创建中间对象,并改写原型链关系

// 中间对象
var F = function(){}
// 将其原型对象指向父类原型对象
F.prototype = Parent.prototype
// 将子类的原型对象指向中间对象
Sub.prototype = new F()
// 修改构造方法
Sub.prototype.constructor = Sub

至此就完成了,我们可以代码验证一下:

let s = new Sub({name: 'diudiu', age: 18})
s.log()
console.log(s instanceof Sub, s instanceof Parent)

控制台输出如下:

log diudiu
true true

我们给父类扩充一个方法, 并通过子类调用:

Parent.prototype.log2 = function() {
  console.log('log2', this.name)
}
s.log2()

// 控制台输出
log2 diudiu

可以看到,后续Parent.prototype有添加新方法和属性,Sub创建的实例对象是可以访问到的。

综上所述:

优点:在原型链层面上实现了继承关系。后续 Parent.prototype有任何的属性和方法扩展,子类仍然能能够访问到。

缺单:需要创建一个中间对象来实现,要对原型链有一定的了解。

3.通过ES6特性class来实现继承关系

定义父类:

class Parent {
    constructor(sender) {
        this.name = sender.name
    }

    log() {
        console.log('log', this.name)
    }
}

定义子类:

class Sub extends Parent {
    constructor(sender) {
        super(sender)
        this.age = sender.age
    }
}

代码验证:

let s = new Sub(sender)
console.log(s)
s.log()
console.log(s instanceof Sub)
console.log(s instanceof Parent)

控制台输出:

Sub { name: 'diudiu', age: 18 }
log diudiu
true
true

可以看到子类没有定义log方法,能够访问到父类的log方法。

综上所述:

优点:代码简洁,容易理解,不需要自己来实现一个中间对象。

缺点:不是所有的主流浏览器都支持ES6的class

参考

相关文章

  • Web前端经典面试试题及答案2

    javascript面向对象中继承实现? 面向对象的基本特征有:封闭、继承、多态。在JavaScript中实现继承...

  • javascript对象继承顺序、分类和内置Math对象

    javascript对象继承顺序、分类和内置Math对象 一、对象的继承顺序 所有对象都是从Object对象继承过...

  • 前端面试题目(二)

    javascript对象的几种创建方式 javascript继承的6种方法 详情:[JavaScript继承方式详...

  • JS Object对象

    概述 JavaScript 原生提供Object对象。JavaScript 的所有其他对象都继承自Object对象...

  • JavaScript之Object对象

    一、javascript高级基础 1. Object JavaScript 的所有其他对象都继承自Object对象...

  • JavaScript对象继承

    开门见山,以下根据继承方式的不同逐一介绍: 基于原型链的方式 这应该是基于js中prototype的特点实现的最简...

  • javascript 对象继承

    构造函数 子类的原型对象-类式继承 缺点,如果父类公有属性是引用类型如数组,就会被所有子类的实例公有,其中一个实例...

  • Javascript对象继承

    一、原型(prototype) JavaScript中,函数本身也是一个包含了方法和属性的对象。prototype...

  • JavaScript对象的继承

    原文 博客原文 大纲 前言1、原型链继承2、借用构造函数实现继承3、组合模式继承4、原型式继承5、寄生式继承6、寄...

  • javaScript对象的继承

    目录: 伪继承 通过中间对象实现 ES6 class实现继承关系 1.伪继承 父类: 子类: 示例: 接着上面的代...

网友评论

      本文标题:javaScript对象的继承

      本文链接:https://www.haomeiwen.com/subject/kdcuvltx.html