JS 有哪些继承方式
JavaScript 中常见的继承方式有以下几种:
-
原型链继承
-
构造函数继承
-
组合继承(原型链加构造函数)
-
原型式继承
-
寄生式继承
-
ES6 的
class
的extends
关键字(用于现代类继承)
1、原型链继承
function Parent() {
this.name = 'Parent';
}
Parent.prototype.getName = function() {
return this.name;
};
function Child() {
}
/*
这一步是关键,设置原型链指向父构造函数的实例,
这样一来,Child就继承了Parent的所有属性和方法
*/
Child.prototype = new Parent();
var child = new Child();
console.log(child.getName()); // 输出: Parent
2、构造函数继承
function Parent() {
this.name = 'Parent';
}
function Child() {
Parent.call(this); // 使用 call 实现继承
}
var child = new Child();
console.log(child.name); // 输出: Parent
3、组合继承(原型链加构造函数)
function Parent() {
this.name = 'Parent';
}
Parent.prototype.getName = function() {
return this.name;
};
function Child() {
Parent.call(this); // 构造函数继承
}
Child.prototype = new Parent(); // 原型链继承
var child = new Child();
console.log(child.getName()); // 输出: Parent
4、原型式继承
function object(o) {
function F() {}
F.prototype = o;
return new F();
}
var parent = {
name: 'Parent',
getName: function() {
return this.name;
}
};
var child = object(parent);
console.log(child.getName()); // 输出: Parent
5、寄生式继承
function createAnother(original) {
var clone = object(original);
clone.sayHi = function() {
return 'Hi';
};
return clone;
}
var parent = {
name: 'Parent',
getName: function() {
return this.name;
}
};
var child = createAnother(parent);
console.log(child.sayHi()); // 输出: Hi
6、ES6 的 class
的 extends
关键字
class Parent {
constructor() {
this.name = 'Parent';
}
getName() {
return this.name;
}
}
class Child extends Parent {
constructor() {
super(); // 调用父类构造函数
}
// 子类可以添加自己的方法
}
const child = new Child();
console.log(child.getName()); // 输出: Parent