官方解释:对于使用过基于类的语言 (如 Java 或 C++) 的开发人员来讲,JavaScript 有点使人困惑,由于它是动态的,而且自己不提供一个 class 实现。(在 ES2015/ES6 中引入了 class 关键字,但那只是语法糖,JavaScript 仍然是基于原型的)。数组
当谈到继承时,JavaScript 只有一种结构:对象。每一个实例对象( object )都有一个私有属性(称之为 proto)指向它的构造函数的原型对象(prototype )。该原型对象也有一个本身的原型对象( proto) ,层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并做为这个原型链中的最后一个环节。浏览器
几乎全部 JavaScript 中的对象都是位于原型链顶端的 Object 的实例。函数
尽管这种原型继承一般被认为是 JavaScript 的弱点之一,可是原型继承模型自己实际上比经典模型更强大。例如,在原型模型的基础上构建经典模型至关简单。this
JavaScript 对象是动态的属性“包”(指其本身的属性)。JavaScript 对象有一个指向一个原型对象的链。当试图访问一个对象的属性时,它不单单在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾。prototype
constructor
,存储的是当前类的自己。注意 Object是Js中内置的基类(最底层类),在他的原型上proto的值为null:不为null也是指向本身。code
function Fn(){ this.x = 100; this.y = 200; this.getX = function(){ console.log(this.x); } } Fn.prototype.getX = function(){ console.log(this.x); } Fn.prototype.getY = function(){ console.log(this.y); } var f1 = new Fn; var f2 = new Fn;