继承——组合继承、类继承
在ES6以前没有extends继承,可以通过构造函数+原型对象模拟实现继承,被称为组合继承。
1、借用父构造函数继承属性
// 借用父构造函数继承属性 // 1、父构造函数 function Father(uname, age) { // this 指向父构造函数的对象实例 this.uname = uname this.age = age } // 2、子构造函数 function Son(uname, age, score) { // this 指向子构造函数的对象实例 Father.call(this, uname, age) // 使用call方法将父构造函数中的this变为子构造函数中的this this.score = score } var son = new Son('刘德华', 19, 100) console.log(son)
2、借用原型对象继承父类型方法
// 1、父构造函数 function Father(uname, age) { // this 指向父构造函数的对象实例 this.uname = uname this.age = age } Father.prototype.money = function () { console.log(10000) } // 2、子构造函数 function Son(uname, age, score) { // this 指向子构造函数的对象实例 Father.call(this, uname, age) // 使用call方法将父构造函数中的this变为子构造函数中的this this.score = score } // Son.prototype = Father.prototype // 这样直接赋值会有问题,如果修改了子原型对象,父原型对象也会跟着一起变化 // 所以要用下面这一种,通过原型链的原理来继承 Son.prototype = new Father() // Father的实例对象可以拿到Father.prototype的方法,但是实例对象会新开辟一个地址,不会影响到Father.prototype // 这样覆盖之后,Son.prototype的constructor是指向Father的,这不正确,应该指向Son才对,所以还有一步操作 Son.prototype.constructor = Son // 如果利用对象的形式修改了原型对象,别忘了利用constructor指回原来的构造函数 Son.prototype.exam = function () { console.log('孩子要考试') } var father = new Father('张学友', 18) var son = new Son('刘德华', 19, 100) console.log(father) console.log(son) console.log(Father.prototype) console.log(Son.prototype)
ES6之前通过 构造函数+原型实现面向对象编程
构造函数几大特点
1、构造函数有原型对象prototype。
2、构造函数原型对象prototype里面有constructor指向构造函数本身。
3、构造函数可以通过原型对象添加方法。
4、构造函数创建的实例对象有__proto__原型指向 构造函数的原型对象。
ES6之后通过 类 实现面向对象编程
类的本质
1、class本质还是一个函数 我们也可以简单的认为类就是构造函数的另外一种写法。
2、类的所有方法都定义在类的prototype属性上。
3、类创建的实力里面也有__proto__指向类的prototype原型对象。
4、所以ES6的类它的绝大部分功能,ES5都可以做到,新的class写法只是让对象原型的写法更加清晰,更加面向对象编程的语法而已。
5、所以ES6的类其实就是语法糖。
6、语法糖:语法糖就是一种便捷的写法,简单理解,有两种方法可以实现同样的功能,但是一种写法更加清晰、方便,那么这个方法就是语法糖。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理