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) 所读取。没有其他任何方式来设置或读取这个值。
创建一个用户自定义的对象需要两步:
通过编写函数来定义对象类型。
通过new来创建对象实例。
创建一个对象类型,需要创建一个指定其名称和属性的函数;对象的属性可以指向其他对象,看下面的例子:
当代码 new Person(…) 执行时,会发生以下事情:
一个继承自 Person.prototype 的新对象被创建。
使用指定的参数调用构造函数 Person,并将 this 绑定到新创建的对象。new Person等同于 new Person(),也就是没有指定参数列表,Person不带任何参数调用的情况。
由构造函数返回的对象就是 new 表达式的结果。如果构造函数没有显式返回一个对象,则使用步骤1创建的对象。(一般情况下,构造函数不返回值,但是用户可以选择主动返回对象,来覆盖正常的对象创建步骤)