JavaScript 复习之实例对象与 new 命令

172 阅读2分钟

构造函数有自己的特征和用法:

  • 函数体内部使用this关键字,代表了索要生成的对象实例
  • 生成对象的时候,必须使用 new 命令

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

  1. 创建一个空对象,作为将要返回的对象实例
  2. 将这个空对象的原型,指向构造函数的prototype属性
  3. 将这个空对象赋值给函数内部的this
  4. 开始执行构造函数内部代码

注意:如果构造函数内部有return语句,而且return后面跟着一个对象,new命令会返回return语句指定的对象,否则,就会不管return语句,返回this对象。

var Vehicle = function(){
    this.price = 1000;
    return 1000;
}
(new Vehicle()) === 1000 //false

var Bsterm = function (){
  this.price = 1000;
  return { price: 2000 };
};

(new Bsterm()).price // 2000

上面代码中,构造函数Vehiclereturn语句,返回的是一个数值。new命令就会忽略这个return语句,返回“构造”后的this对象。 构造函数Bstermreturn语句,返回的是一个新对象。new命令会返回这个对象,而不是this对象。

如果是普通函数(内部没有this关键字的函数)使用new命令,则会返回一个空对象。

new.target : 函数内部可以使用new.target属性。如果当前函数是new命令调用,new.target指向当前函数,否则为undefined

function f() {
  console.log(new.target === f);
}

f() // false
new f() // true

Object.create() 创建实例对象

构造函数作为模板,可以生成实例对象。但是有时候拿不到构造函数,只能拿到一个现有对象。我们希望把这个对象作为模板,生成新的实例对象,这时候就可以用Object.create()方法。

var person1 = {
  name: '张三',
  age: 38,
  greeting: function() {
    console.log('Hi! I\'m ' + this.name + '.');
  }
};

var person2 = Object.create(person1);

person2.name // 张三
person2.greeting() // Hi! I'm 张三.