Javascript Class

它没有”子类”和”父类”的概念,也没有”类”(class)和”实例”(instance)的区分,全靠一种很奇特的”原型链”(prototype chain)模式,来实现继承。

创建一个类

1
2
3
4
5
6
function Dog(name) {
this.name = name;
}

var dogA = new Dog('大毛');
console.log(dogA.name);

缺陷,无法共享属性和方法

引入prototype解决共享问题

1
2
3
4
5
6
7
8
9
10
11
12
function Dog(name) {
this.name = name;
}

Dog.prototype = {type: '神犬'};

var dogA = new Dog('大毛');
var dogB = new Dog('二毛');


console.log(dogA.type);
console.log(dogB.type);

由于所有的实例对象共享同一个prototype对象,那么从外界看起来,prototype对象就好像是实例对象的原型,而实例对象则好像”继承”了prototype对象一样。

在ES2015/ES6中引入了class关键字,但只是语法糖,JavaScript 仍然是基于原型的

当谈到继承时,JavaScript 只有一种结构:对象。

每个对象都有一个私有属性(称之为 [[Prototype]]),它持有一个连接到另一个称为其 prototype 对象(原型对象)的链接。该 prototype 对象又具有一个自己的原型,层层向上直到一个对象的原型为 null。(译者注:Object.getPrototypeOf(Object.prototype) === null; // true)根据定义,null 没有原型,并作为这个原型链中的最后一个环节。

JavaScript 中几乎所有的对象都是位于原型链顶端的Object的实例。

原型继承经常被视为 JavaScript 的一个弱点,但事实上,原型继承模型比经典的继承模型更加强大。例如,在一个原型模型之上构建一个经典模型是相当容易的。

参考链接:

http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_inheritance_mechanism_in_javascript.html

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain