它没有”子类”和”父类”的概念,也没有”类”(class)和”实例”(instance)的区分,全靠一种很奇特的”原型链”(prototype chain)模式,来实现继承。
创建一个类1
2
3
4
5
6function Dog(name) {
this.name = name;
}
var dogA = new Dog('大毛');
console.log(dogA.name);
缺陷,无法共享属性和方法
引入prototype解决共享问题
1 | function Dog(name) { |
由于所有的实例对象共享同一个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