this
在不同继承方式中的变化及作用
原型链继承
- 变化:在原型链继承中,子类的实例通过原型链访问父类的属性和方法。
this
在这种情况下,对于父类方法中访问的属性,是在查找原型链的过程中确定最终值。如果子类实例中没有找到该属性,会沿着原型链一直向上查找,直到找到为止或者到达原型链顶端(null
)。
- 作用:
this
用于在对象的方法中访问对象自身的属性和方法。例如在父类方法中,this
指向调用该方法的对象实例,这样通过原型链继承过来的方法,在执行时能正确访问到实例相关的数据。
借用构造函数继承
- 变化:通过在子类构造函数中调用父类构造函数,并使用
call
或apply
方法,将父类构造函数中的this
绑定到子类的实例上。这样,父类构造函数中对this
的操作,实际上是在子类实例上进行操作,为子类实例创建了一份独立的属性副本。
- 作用:主要作用是让子类实例拥有父类实例的属性,避免了原型链继承中可能出现的共享属性问题。通过将父类构造函数中的
this
绑定到子类实例,使得每个子类实例都有自己独立的属性,增强了实例之间的独立性。
组合继承实现代码示例
function Animal(name, age) {
this.name = name;
this.age = age;
this.speak = function() {
console.log(`${this.name} makes a sound.`);
};
}
function Dog(name, age, breed) {
// 借用构造函数继承
Animal.call(this, name, age);
this.breed = breed;
}
// 原型链继承
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
Dog.prototype.bark = function() {
console.log(`${this.name} barks.`);
};
// 测试
const myDog = new Dog('Buddy', 3, 'Golden Retriever');
myDog.speak();
myDog.bark();