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.htmlhttp://www.jb51.net/article/78709.htm

以上是个人学习总结的一些知识,如有误,还请下方留言指正,非常感谢!

posted @ 2017-07-24 10:51  Medusa1st  阅读(625)  评论(0)    收藏  举报