JS面向对象继承方法

类式继承

类式继承是将父类的实例赋值给子类的原型对象:

    function Parent() {
        this.books = ['JS', 'PHP', 'CSS']
    }
    Parent.prototype.fun = function () {
        console.log(1);
    };

    function Child() { }
    Child.prototype = new Parent();

    var instance1 = new Child();
    var instance2 = new Child();

    instance1.books.push('Node');
    console.log(instance2.books); //["JS", "PHP", "CSS", "Node"] 如果你看过我上一节的内容,你就知道为什么了。

    //直接告诉你原型吧: 因为books是instance1的原型对象的属性 上面是改变值 并没有赋值

所以这种类型的继承果断被pass掉。

 构造函数继承

    //构造函数继承一般讲公共属性先声明并且放在 构造函数内,当修改实例对象的name属性时就不会互相干扰了
    function Human(name) {
        this.name = name;
    }function Male(name) {
        Human.call(this, name)
    }
    let person1 = new Male('arrayBuffer');
    let person2 = new Male('jiaojiao');

实例化时,每个实例本身都会拥有构造函数中属性,所以修改这些属性时不会互相干扰。

组合模式

    function Human(name, age) {
        this.name = name;
        this.age = age;
    }
    Human.prototype.fun = function () {
        console.log('sleeping');
    };
    function Male(name, age, weight) {
        this.weight = weight;
        Human.call(this, name, age)
    }

    Male.prototype = new Human(); //这里千万别不能 Human.prototype
    Male.prototype.goodAt = function () {
        console.log('搬砖')
    };

    let man = new Male('arrayBuffer', 24, '60Kg');
    console.log(man);

这里需要注意prototype的层级关系

组合模式能够解决上述两个问题,但是你看下图:

Male 的原型对象上多了age name属性这是什么鬼?这是因为执行 Male.prototype = new Human(),Male.prototype执向的对象就是这样的。即 new Human()执行了两次哟。

转载于:https://www.cnblogs.com/noper/p/6771065.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值