JavaScript (面向对象编程篇)


\(update : 2022.2.5\)

学习原文

\(JavaScript\) 的所有数据都可以看成对象.

作者先提及了 Java 或 c# 面向对象的两个基本概念 .

类 : 定义 Student 来表示学生类型 , 但不表示某个具体的学生 .

实例 :实例是根据类创建的对象 , 例如根据 Student 类可以创建出 xiaoming , xiaohong的多个具体的例子.

类似于 C 中的结构体.

不过在 JavaScript 中有区别 , 它是通过原型 (prototype) 来实现面向对象编程.

var Student = {
    name: 'Robot',
    height: 1.2,
    run: function () {
        console.log(this.name + ' is running...');
    }
};

var xiaoming = {
    name: '小明'
};

xiaoming.__proto__ = Student;

xiaoming.name; // '小明'
xiaoming.run(); // 小明 is running...

最后一行代码把 xiaoming 的原型指向了对象Student,看上去 xiaoming 仿佛是从 Student 继承下来的 .

同样可以指向其他的对象.

var Bird = {
    fly: function () {
        console.log(this.name + ' is flying...');
    }
};

xiaoming.__proto__ = Bird;

xiaoming.fly(); // 小明 is flying...


但作者提醒我们不要直接用 obj._proto_ 去改变一个对象的原型 . 用 Object.create() 的方法可以传入一个原型对象 , 并创建一个基于该原型的新对象 (它是没有任何属性的).

看例子 :

// 原型对象:
var Student = {
    name: 'Robot',
    height: 1.2,
    run: function () {
        console.log(this.name + ' is running...');
    }
};

function createStudent(name) {
    // 基于Student原型创建一个新对象:
    var s = Object.create(Student);
    // 初始化新对象:
    s.name = name;
    return s;
}

var xiaoming = createStudent('小明');
xiaoming.run(); // 小明 is running...
xiaoming.__proto__ === Student; // true