2006年,DouglasGrockford写了一篇文章:《JavaScript 中的原型式继承》(《JavaScript中的原型继承》)。这篇文章介绍了一种严格意义上不涉及构造函数的继承方法。他的出发点是,即使没有自定义类型,对象之间的信息共享也可以通过原型来继承。文章最后给出了一个函数:functionobject(o){functionF(){}F.prototype=oreturnnewF()}于是,JavaScript在《JavaScript 高级程序设计》里多了一个——原型继承于是乎,ECMAScript5加入了Object.create()方法标准化原型继承的概念varobj=Object.create({name:'johan',age:23})//obj继承属性name和agevarobj2=Object.create(null)//obj2不继承任何属性和方法varobj3=Object.create(Object.prototype)//与{}和newObject()相同varobj4=Object.create({},{property1:{value:true,writable:true}})//第二个参数与Object.defineProperties()图一致Object.createimplementsfunctioncreate(proto){functionF(){}F.prototype=protoreturnnewF()}第一步:functionF(){}是创建一个函数,因为契约的首字母大写,所以被当做构造函数。在创建函数F时,F的构造函数和它的原型对象有这样的Layer关系:F.prototype===F.prototype;//假设你把F.prototype当作一个值F.prototype.constructor===F;第二步:F.prototype=proto即将赋值给F.prototype对于传入的proto,F.prototype=F.prototype和F.prototype.constructor=F被打破,他们的关系就是第三步:returnnewF()第三步的解释有点乱,因为涉及到了对new的操作,我们在new中说过改变对象,new会创建一个对象,并将该对象的隐式原型(__proto__)指向构造函数的原型对象,初始化构造函数。如果有返回值,我们也会在后续的原型中介绍。new是隐式原型继承,Object.create是显式原型继承这里我们按照实现new的方式来解释returnnewF()。newF之后的实例的__proto__指向了F.prototype,而这个值在第二步已经指向了传入的proto,所以在第三步就有了newF().__proto__=proto可能你还不清楚,我们结合例子一目了然varobj=Object.create({name:'johan'})第三步的图变成这样:就是这样,obj继承自{name:johan}this至于对象,至于F.prototype={name:'johan'},在调用Object.create后,因为没有人使用F函数,所以也被引擎垃圾回收了,所以变成了obj.__proto__={name:'johan'}这样就继承了“原型继承”。原理是这样的。简单的说,就是创建一个空的(构造函数)函数,并关联它的原型(实现继承)Object.create(null)在阅读源码的时候,我们经常会看到Object.create(null)来初始化一个新的对象。至于为什么用这个方法而不是newObject或者{},是因为new和literal都是继承自Object的构造函数,而Object.create(null),你可以得到一个对象,没有任何继承痕迹varobj=Object.create(null)不信你打印obj试试。说完new和Object.create,我们再来看看深入理解JavaScript的系列原型————深入理解JavaScript的开端——什么是JavaScript深入理解JavaScript——WhatJavaScript是由什么组成的?深入理解JavaScript——一切皆对象Object.create深入理解JavaScript——copy的秘密深入理解JavaScript——Prototype深入理解JavaScript——继承深入理解JavaScript——theJavaScript先帝深入理解JavaScript-instanceof-寻祖深入理解JavaScript-Function深入理解JavaScript-DeepScope深入理解JavaScript——this关键字深入理解JavaScript——call、apply、bind三大通用深入理解JavaScript——立即执行函数(IIFE)深入理解JavaScript——词法环境中-深入理解JavaScript——深入理解执行上下文和调用栈JavaScript——ScopeVSExecutionContext深入理解JavaScript——Closure深入理解JavaScript——防抖和节流深入理解JavaScript——函数式编程深入理解JavaScript——垃圾回收机制深入理解JavaScript——数组深入理解JavaScript——Cycles来这里深入理解JavaScript——String
