第5章:继承(Inheritance)
一、导读
1.1 本章学习目标
第5章讲解 JavaScript 中的继承机制。JavaScript 使用基于原型的继承,这与传统的基于类的继承有本质区别。
1.2 为什么第五章如此重要
理解 JavaScript 的继承机制是掌握面向对象编程的关键。原型链是 JavaScript 最独特的特性之一。
1.3 核心问题引导
原型继承如何工作?
函数式继承有什么优势?
如何实现差异化继承?
JavaScript 的 class 语法是真正的类吗?
二、核心概念详解
5.1 原型继承
javascript
var animal = {
type: "animal",
speak: function() { return "I am a " + this.type; }
};
var dog = Object.create(animal);
dog.type = "dog";
dog.bark = function() { return "Woof!"; };
dog.speak(); // "I am a dog"
dog.bark(); // "Woof!"5.2 函数式继承
javascript
function mammal(spec) {
var that = {};
that.getName = function() { return spec.name; };
that.says = function() { return spec.saying || ""; };
return that;
}
function cat(spec) {
spec.saying = spec.saying || "meow";
var that = mammal(spec);
that.purr = function() { return "purr"; };
return that;
}
var myCat = cat({name: "Henrietta"});
myCat.getName(); // "Henrietta"
myCat.purr(); // "purr"5.3 差异化继承
javascript
function proto(base, diff) {
var result = Object.create(base);
for (var key in diff) {
if (diff.hasOwnProperty(key)) {
result[key] = diff[key];
}
}
return result;
}
var base = {x: 1, y: 2};
var extended = proto(base, {y: 3, z: 4});
// extended: {x: 1, y: 3, z: 4}三、实战案例
3.1 动物层级结构
javascript
function animal(spec) {
var that = {};
that.getName = function() { return spec.name; };
that.says = function() { return spec.saying; };
return that;
}
function cat(spec) {
spec.saying = spec.saying || "meow";
var that = animal(spec);
that.purr = function() { return "purr"; };
return that;
}
function dog(spec) {
spec.saying = spec.saying || "woof";
var that = animal(spec);
that.bark = function() { return "woof!"; };
return that;
}
var myCat = cat({name: "Kitty"});
var myDog = dog({name: "Rex"});四、本章小结
JavaScript 使用原型继承,通过 Object.create 创建继承链。函数式继承提供了一种避免 new 关键字的方式。
五、思考与练习
原型继承和类继承有什么本质区别?
函数式继承的优势是什么?
ES6 class 语法是真正的类吗?
如何实现多继承?
原型链的性能影响是什么?