Javascript面向对象编程--类式继承

参考书籍:JavaScript设计模式

声明2个类,第一个类的实例赋值给第二个类的原型。例如

   //声明父类
    function SuperClass() {
        this.superValue = true;
    };
    //为父类添加共有方法
    SuperClass.prototype.getSuperValue = function () {
        return this.superValue;
    };
    //声明子类
    function SubClass() {
        this.subValue = false;
    };
    //继承父类
    SubClass.prototype = new SuperClass();
    //为子类添加共有方法
    SubClass.prototype.getSubValue = function () {
        return this.subValue;
    }

类的原型对象的作用就是为类的原型添加共有的方法,但是不能直接访问这些属性和方法,必须通过原型 prototype来访问。
我们在实例化一个父类的时候,新的对象复制了父类构造函数内的属性和方法并把原型_proto_(新实例化对象的原型)指向了父类的原型对象。新实例化的对象不仅可以访问父类原型上的属性和方法,同样可以访问从父类构造函数中复制的属性和方法。将这个新实例化的对象赋值给了子类,子类就有了同新对象一样的权利。 这就是类式继承原理。

JS

//声明父类
function SuperClass() {
    this.superValue = true;
};
//为父类添加共有方法
SuperClass.prototype.getSuperValue = function () {
    return this.superValue;
};
//声明子类
function SubClass() {
    this.subValue = false;
};
//继承父类
SubClass.prototype = new SuperClass();
//为子类添加共有方法
SubClass.prototype.getSubValue = function () {
    return this.subValue;
}

function displayBook() {
    var subInstance = new SubClass();
    console.log('super value: ' + subInstance.getSuperValue());//true
    console.log('sub value: ' + subInstance.getSubValue());//false

}

可以通过 instanceof 来检测某一个对象是否是某一个类的实例(而不是继承),它是通过判断对象的 prototype 链来确定这个对象是否是某个类的实例,而不关系对象与类的自身结构。

    console.log(subInstance instanceof SuperClass);//true
    console.log(subInstance instanceof SubClass);//true
    console.log(SubClass instanceof SuperClass);//false

类似继承缺点

  1. 由于子类通过其原型 prototype对父类实例化,继承了父类。父类中的公有属性要是引用类型,就会在子类中被所有实例共有,因此一个子类的实例更改子类原型(从父类函数中继承的公有属性)就会直接影响到其他子类。
    例如:
//声明父类
function SuperClass() {
    //引用类型的公有属性
    this.books = ['java', 'html'];
};
//声明子类
function SubClass() {

};
SubClass.prototype=new SuperClass();

function displayBook() {
    var sub1 = new SubClass();
    console.log('sub1 super value: ' + sub1.books);//sub1 super value: java,html
    var sub2 = new SubClass();
    sub2.books.push('css');
    console.log('sub1 super value: ' + sub1.books);//sub1 super value: java,html,css
    console.log('sub2 super value: ' + sub2.books);//sub2 super value: java,html,css
}

sub2修改了book的属性就会影响到sub1中book的属性。
2. 由于子类实现的继承是靠其原型prototype对父类的实例化实现的,因此在创建父类的时候,是无法向父类传递参数的,因而在实例化父类的时候也无法对父类构造函数的属性进行初始化。

优化参照
https://blog.csdn.net/weixin_44924173/article/details/91040014

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值