继承是面向对象编程中的一个重要概念,通过继承可以使子类的实例拥有在父类中定义的属性和方法。
- function UserBase(){
- }
- function User(){
- }
- User.prototype = new UserBase();
将父类的实例作为子类的原型。
实际上使用父类的构造函数来增强子类,等于是把父类的构造函数复制给子类。
- function UserBase(){
- }
- function User(userName) {
- UserBase.call(this);
- this.userName = userName;
- }
- let user = new User("鬼鬼")
- user.userName;
优点:
(1)可以向构造函数传参数
(2)可以实现多继承,多call几个
缺点:
(1)无法实现函数复用
(2)只能继承父类的属性和方法,不能继承父类的原型
为父类实例添加新属性,作为子类实例返回。
- function UserBase(){
- }
- function User(userName) {
- let userBase = new UserBase();
- userBase.userName = userName;
- return userBase;
- }
- let user = new User("鬼鬼")
- user.userName;
缺点:无法实现多继承
- function UserBase(userName){
- }
- UserBase.prototype.showInfo = function(){
- console.log(this.userName)
- }
- function User(userName) {
- let userBase = new UserBase();
- for (let attr in userBase) {
- User.prototype[attr] = userBase[attr];
- }
- this.userName = userName;
- }
- let user = new User("鬼鬼")
- user.showInfo();
不可枚举方法拷贝不了
通过调用父类构造函数,继承了父类的属性,并保留了传参的优点。
然后再将父类实例作为子类原型,实现了函数复用。
- function UserBase(userName){
- this.userName = userName
- }
- UserBase.prototype.showInfo = function(){
- console.log(this.userName)
- }
- function User (userName){
- //call方式
- UserBase.call(this,userName)
- //apply方式
- UserBase.apply(this,[userName])
- }
- User.prototype = new UserBase()
- let user = new User("鬼鬼")
- user.showInfo();
优点:
缺点:
调用了两次父类构造函数
通过寄生的方式,去掉了父类的实例属性,在调用父类构造函数时,
就不会初始化两次实例方法,避免了组合继承的缺点
- function UserBase(userName){
- this.userName = userName
- }
- UserBase.prototype.showInfo = function(){
- console.log(this.userName)
- }
- function User (userName){
- UserBase.call(this,userName)
- }
- User.prototype = Object.create(UserBase.prototype)
- User.prototype.constructor = User
- let user = new User("鬼鬼")
- user.showInfo();
- class UserBase{
- constructor(userName){
- this.userName = userName
- }
- showInfo(){
- console.log(this.userName)
- }
- }
- class User extends UserBase{
- constructor(value){
- super(value)
- }
- }
- var user = new User("鬼鬼")
- user.showInfo();
参考资料
https://blog.csdn.net/guoqing2016/article/details/106418081/
http://www.bubuko.com/infodetail-2556919.html
本文转载自微信公众号「前端人」,可以通过以下二维码关注。转载本文请联系前端人公众号。
新闻标题:JS有哪些方式可以实现继承?
链接分享:http://www.shufengxianlan.com/qtweb/news11/463061.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联