JavaScript继承模式

1,原型链继承

  • 步骤
    • 定义父类型构造函数
    • 给父类型的原型添加方法
    • 定义子类型的构造函数
    • 创建父类型的对象赋值给子类型的原型
    • 将子类型原型的构造属性设置为子类型
    • 给子类型原型添加方法
    • 创建子类型的对象: 可以调用父类型的方法
  • 关键: 子类型的原型为父类型的一个实例对象
function Supper() {
  this.supper = 'supper'
}
Supper.prototype.showSupperProp = function () {
  console.log(this.supper)
}
function Sub() {
  this.sub = 'sub'
}
Sub.prototype = new Supper() //子类型的原型为父类型的一个实例对象
Supper.prototype.showSubProp = function () {
  console.log(this.sub)
}
let s = new Sub()
s.showSupperProp() //supper
console.log(s.constructor) //ƒ Supper() {
                            // this.supper = 'supper'
                            //}

为了让s的constructor指向的是Sub,应该要添加Sub.prototype.constructor = Sub

原型继承.png

2.借用构造函数继承(假的,实际上并没有继承)

  • 步骤
    • 定义父类型构造函数
    • 定义子类型构造函数与
    • 在子类型构造函数中调用父类型构造
  • 关键:在子类型构造函数中通过call()调用父类型构造函数
function Person(name,age) {
  this.name = name
  this.age = age
}
function Student(name,age,sex) {
  Person.call(this,name,age) //相当于this.Person(name,age) 即 this.name = name;this.age = age
  this.sex = sex
}
let s = new Student('Tom',20,'男')
console.log(s.name,s.age,s.sex) //Tom 20 男

3.原型链+借用构造函数的组合继承

  • 利用原型链实现对父类型对象的方法继承
  • 利用call()借用父类型构造函数初始化相同属性
function Person(name,age) {
  this.name = name
  this.age = age
}
Person.prototype.setName = function(name) {
  this.name = name
}
function Student(name,age,sex) {
  Person.call(this,name,age) //为了得到属性,相当于this.Person(name,age) 即 this.name = name;this.age = age
  this.sex = sex
}
Student.prototype = new Person() //为了能看到父类型的方法
Student.prototype.constructor = Student //修正constructor属性
Student.prototype.setSex = function(sex) {
  this.sex = sex
}
let s = new Student('Tom',20,'男')
s.setSex('女')
s.setName('Amy')
console.log(s.name,s.age,s.sex) //Amy 20 女
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 我是谁,我来自哪,我是谁的谁 想必大家一定在学习或者开发过程常常被JS独有的原型继承拨过不少脑弦吧,为何不迎问题而...
    俗三疯阅读 2,642评论 0 2
  • 基于这篇文章的一些名称约定: 上面的约定应该是比较合理的,如果难以理解,可以查看黯羽轻扬:JS学习笔记2_面向对象...
    一直玩编程阅读 3,499评论 1 7
  • 上一篇文章说了继承模式,其实上一章节的继承模式是有一点瑕疵的,这个瑕疵并不是由模式引起的,而是由JavaScrip...
    jaimor阅读 1,254评论 0 1
  • 例子 我们生成两个构造函数,后面的例子都是让‘’猫‘’继承‘’动物‘’的所有属性和方法。 动物(为了更好的理解各种...
    流光号船长阅读 2,642评论 0 1
  • 今天我们进一步介绍JavaScript继承的内容,前面一章介绍了如何利用原型链继承,但是原型链继承中也会出现一些不...
    FeRookie阅读 3,424评论 0 1