new命令

new命令的作用,就是执行构造函数,返回一个实例对象。

  1. var Vehicle = function () {
  2. this.price = 1000;
  3. };
  4. var v = new Vehicle();
  5. v.price // 1000
  1. 如果忘了使用new命令,构造函数就变成了普通函数,并不会生成实例对象。这个时候,this会指向全局作用域,造成变量的污染。
  1. var Vehicle = function (){
  2. this.price = 1000;
  3. };
  4. var v = Vehicle();
  5. v // undefined
  6. price // 1000

new 命令的原理

使用new命令时,它后面的函数依次执行下面的步骤。

  1. 创建一个空对象,作为将要返回的对象实例。
  2. 将这个空对象的原型,指向构造函数的prototype属性。
  3. 将这个空对象赋值给函数内部的this关键字。
  4. 开始执行构造函数内部的代码。
  1. var Vehicle = function () {
  2. this.price = 1000;
  3. return 1000;
  4. };
  5. (new Vehicle()) === 1000
  6. // false

上面代码中,构造函数Vehicle的return语句,返回的是一个新对象。new命令会返回这个对象,而不是this对象。
另一方面,如果对普通函数(内部没有this关键字的函数)使用new命令,则会返回一个空对象。

  1. function getMessage() {
  2. return 'this is a message';
  3. }
  4. var msg = new getMessage();
  5. msg // {}
  6. typeof msg // "object"