JavaScript (new)创建一个对象的过程

在JavaScript的世界中,对象Object的操作是比较灵活的,可以通过创建一个对象,来进行继承,拓展,而且对象的属性是极其容易拓展的。

所以创建一个对象实例流程可以是这样子的:

    function Person(name , age){
         this.name = name;
         this.age = age;
         console.log(this); // Person {name: "neo", age: "23"}
         //return this; 默认隐藏
     }
     var p1 = new Person('neo','10');
     console.log(p1.name);

    等同于:
     function Person(name , age){
         this.name = name;
         this.age = age;
         console.log(this); //window
         return this;
     }
     var p1 = new Object(); //var p1 = {}
     p1 = Person('neo','23');
     console.log(p1.name);

 

 

 

new 关键字做了什么

在 JavaScript 中,使用 new 关键字后,意味着做了如下四件事情:

创建一个新的对象,这个对象的类型是 object;

设置这个新的对象的内部、可访问性和[[prototype]]属性为构造函数(指prototype.construtor所指向的构造函数)中设置的;

执行构造函数,当this关键字被提及的时候,使用新创建的对象的属性; 返回新创建的对象(除非构造方法中返回的是‘无原型’)。

在创建新对象成功之后,如果调用一个新对象没有的属性的时候,JavaScript 会延原型链向止逐层查找对应的内容。这类似于传统的‘类继承’。

注意:在第二点中所说的有关[[prototype]]属性,只有在一个对象被创建的时候起作用,比如使用 new 关键字、使用 Object.create 、基于字面意义的(函数默认为 Function.prototype ,数字默认为 Number.prototype 等)。它只能被Object.getPrototypeOf(someObject) 所读取。没有其他任何方式来设置或读取这个值。


MDN传送门

创建一个用户自定义的对象需要两步:

通过编写函数来定义对象类型。
通过new来创建对象实例。

创建一个对象类型,需要创建一个指定其名称和属性的函数;对象的属性可以指向其他对象,看下面的例子:

当代码 new Person(…) 执行时,会发生以下事情:

一个继承自 Person.prototype 的新对象被创建。

使用指定的参数调用构造函数 Person,并将 this 绑定到新创建的对象。new Person等同于 new Person(),也就是没有指定参数列表,Person不带任何参数调用的情况。

由构造函数返回的对象就是 new 表达式的结果。如果构造函数没有显式返回一个对象,则使用步骤1创建的对象。(一般情况下,构造函数不返回值,但是用户可以选择主动返回对象,来覆盖正常的对象创建步骤)

 

posted on 2020-02-08 21:38  漫思  阅读(2471)  评论(0编辑  收藏  举报

导航