JavaScript创建对象的3种方式以及new方法的过程
我在学习JavaScript过程中遇到的第一个难点就是原型,而在学习原型的过程中又发现它跟js创建对象以及js的new方法过程息息相关,几个概念结合到一起看,才对原型有了基础的理解。
下面记录一下自己学习过程总结的一些知识点。
(本篇仅包含js创建对象的3种方式以及new方法的过程,下一篇将总结js原型的特征。)
一、 JavaScript创建对象的3种方式
1. 通过对象字面量构造,其[[prototype]]指向Object.prototype。

2. 通过构造函数构造,其[[prototype]]指向其构造函数的prototype属性指向的对象。

3. 通过Object.create构造,其[[prototype]]指向Object.create的参数。

总结:第1种创建方式其实就是第2种的语法糖,过程一致。第3种方式通过Object.create来创建的对象并不会继承其父对象的属性和方法,只能通过原型链来访问。
二、 JavaScript的new方法过程
1. 当前函数的return未定义且没有使用new运算符时,直接调用会默认返回undefined。

2. 当前函数的return未定义或者不是一个对象(也不是一个函数)时,使用new运算符会返回一个新构造的对象。

3. 当前函数的return是一个对象(或者是一个函数)时,使用new运算符会直接返回这个对象。
这种情况时,新对象的隐式原型(__proto__)并不指向它的构造函数的显式原型(prototype),而指向返回的这个对象(或函数)的构造函数(即Object或Function)的显式原型(prototype)。
构造函数返回一个对象时:

构造函数返回一个函数(函数是一种特殊的对象)时:

4. new会改变this的指向,指向当前对象。
5. 普通函数也是通过new Function()构造函数来进行构造的,继承的是Function和Object的属性方法,因为根据原型链,Function.prototype由Object构造,因此Function.prototype.__proto__ === Object.prototype。

以上5点都是可以用下面这个new的过程来解释:
new Person("Tom") = { var obj = {}; obj.__proto__ = Person.prototype; var result = Person.call(obj,"Tom"); return typeof result === 'object' || 'function'? result : obj; }
参考文章:http://www.cnblogs.com/SpringRen/p/4212136.html和http://www.jb51.net/article/78709.htm
以上是个人学习总结的一些知识,如有误,还请下方留言指正,非常感谢!

浙公网安备 33010602011771号