JS中实现继承
1.使用call实现继承(不推荐)
function Animal(name) {
this.name = name;
this.run = function() {
console.log(this.name, "跑");
}
}
function Dog(name) {
// 继承
Animal.call(this, name);
this.sleep = function() {
console.log(this.name, "睡");
}
}
dog = new Dog("旺财");
dog.run(); // 旺财 跑
dog.sleep(); // 旺财 睡
(1)优点
- 父类的构造函数在子类构造函数中调用,可以向父类构造函数传递参数;
- 子类实例化后,不会受到父类实例化后修改属性的影响。
(2)缺点
- 子类实例无法通过instanceof判断出父类的实例;
- 无法继承父类原型链上的属性和方法,只能继承父类的实例属性和方法;
- 子类实例无法通过instanceof判断出父类的实例;
2.使用原型实现继承(不推荐)
function Animal(){
this.run = function() {
console.log(this.name, "跑");
}
}
function Dog(name){
this.name = name;
this.sleep = function() {
console.log(this.name, "睡");
}
}
// 继承
Dog.prototype = new Animal();
dog = new Dog("大黄");
dog.sleep(); // 大黄 睡
dog.run(); // 大黄 跑
优点:
- 子类实例可以通过instanceof判断出父类的实例;
- 每个子类实例共享父类的属性和方法,节省内存。
缺点:
- 无法继承父类原型链上的属性和方法,只能继承父类的实例属性和方法;
- 子类实例共享父类的属性和方法时,如果修改了属性值,其他实例也会受到影响;
- 无法传递参数给父类的构造函数,父类的属性只能通过子类的构造函数传递。
3.上述两种方法结合(推荐)
// 1.定义一个父类
function Animal(name) {
this.name = name;
}
// 2.定义父类的原型方法
Animal.prototype.speak = function() {
console.log(this.name + ' makes a noise.');
};
// 3.定义一个子类
function Dog(name, breed) {
Animal.call(this, name); // 调用父类的构造函数
this.breed = breed;
}
// 4,将子类的原型设置为父类的一个实例,实现继承
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
// 5.定义子类的原型方法
Dog.prototype.bark = function() {
console.log(this.name + ' barks.');
};
// 创建一个Dog对象并调用其方法
var myDog = new Dog('Buddy', 'Labrador');
myDog.speak(); // Buddy makes a noise.
myDog.bark(); // Buddy barks.
优点:
- 子类实例可以通过instanceof判断出父类的实例;
- 子类即拥有父类构造函数中的属性和方法,也有父类prototype中的属性和方法;
原文地址:https://blog.csdn.net/Nick_Li_/article/details/135996121
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!