5JavaScript: The Good Parts

继承

原型继承

原型链函数式继承差异化继承多继承

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第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 语法是真正的类吗?

如何实现多继承?

原型链的性能影响是什么?


5/9继承
0%