继承有哪些方式?他们各自有什么不同点? call方法有什么作用?如何使用? 原型方法中的this指向谁?会不会发生改变?如果会,举个例子描述怎么改变的
时间: 2024-05-06 12:18:05 浏览: 83
js原型继承的两种方法对比介绍.docx
继承有以下几种方式:
1. 原型链继承:子类的原型对象指向父类的实例,通过原型链实现继承。不推荐使用,因为会存在父类属性共享的问题。
2. 构造函数继承:子类的构造函数中调用父类构造函数,并通过call或apply改变父类构造函数内部this指向,从而继承父类的属性和方法。但是无法继承父类原型上的属性和方法。
3. 组合继承:结合原型链继承和构造函数继承的方式,既能够继承父类的属性和方法,又能够继承父类原型上的属性和方法。但是会存在父类构造函数调用两次的问题。
4. 寄生组合继承:优化了组合继承的问题,只调用了一次父类构造函数,通过Object.create()方法创建一个中间对象,使得子类的原型对象指向该中间对象,从而继承父类原型上的属性和方法。
call方法用于调用一个函数,可以修改函数内部的this指向,还可以传递参数。可以使用call方法来实现构造函数继承或者实现类似继承的效果。
在原型方法中,this指向的是调用该方法的对象。如果改变了调用该方法的对象,this指向也会发生改变。
例如:
```javascript
function Person(name) {
this.name = name;
}
Person.prototype.sayName = function() {
console.log(this.name);
};
const person1 = new Person('Tom');
const person2 = new Person('Jerry');
person1.sayName(); // 输出Tom
person2.sayName(); // 输出Jerry
person1.sayName.call(person2); // 输出Jerry
```
在上面的例子中,person1原本调用sayName方法时,this指向的是person1对象,输出了Tom。但是通过call方法,将该方法的调用者变成了person2对象,因此this指向person2,输出了Jerry。
阅读全文