借用构造函数和组合继承

6.3.2借用构造函数
用来解决原型中包含引用类型所带来的问题。
解决思路:在子类型的函数构造的内部调用超类型的构造函数

function Person7 () {
    this.colors = ['天下','小','晓晓'];
}

function Son7() {
    //继承了Person7
    //这里通过改变this的指向,并且调用了构造函数。
    Person7.call(this);
}

var instance1 = new Son7();
instance1.colors.push('aa123');
console.log('instance1',instance1.colors);

var instance2 = new Son7();
console.log('instance2',instance2.colors);
Person7.call(this)

这行代码借调了超类型的构造函数。通过Call方法和apply方法,我们实际在Son7实例化的环境下调用了构造函数Person7。这样一来就会在新Son7对象上执行Person7()函数中定义的所有对象初始化代码,结果每个Son7的每个实例都会有自己的colors属性的副本了。

//1.传递参数
function Person8(name) {
    this.name = name;
}

function Son8() {
    Person8.call(this,'天下');
    this.age = 18;
}
var son8 = new Son8();
console.log('son8',son8);
console.log('son8.age',son8.age);

借用构造函数存在的问题:

  • 方法都在构造函数中定义,无法复用。
  • 在超类型的原型中定义的方法,对自类型而言是不可见的。
    6.3.3 组合继承
    也叫伪经典继承,指的是将原型链和借用构造函数的技术组合在一块,从而发挥二者之长的一种继承模式。
    思想:使用原型链实现对原型属性和方法的继承,而通过构造函数来实现对实例属性的继承。
function Person13(name) {
    console.log('name',name);
    this.name = name;
    this.colors = ['aa','bb'];
}
//共享的方法
Person13.prototype.sayName = function() {
    return this.name;
}

function Son13(name,age) {
    //继承属性
    Person13.call(this,name);
    this.age = age;
}

Son13.prototype = new Person13();
var son13  = new Son13('秦扫六合',1);
Son13.prototype.sayAge = function() {
    return this.age;
}
son13.colors.push('123');

console.log('son13.colors',son13.colors);
//原型方法是共享的
console.log('son13.sayName',son13.sayName()); //天下
console.log('son13.sayAge',son13.sayAge());
console.log('son13.age',son13.age);

var son131 = new Son13('统一天下',2);
console.log('son131.colors',son131.colors);
console.log('son131.age',son131.age);

//原型方法是共享的
console.log('son131.sayName',son131.sayName()); //天下
console.log('son131.sayAge',son131.sayAge());

你可能感兴趣的:(原生js)