使用javascript进行OOP编程:无论对象是如何实例化的,都要确保这是正确的事情

时间:2016-03-16 06:37:35

标签: javascript oop

来自https://developer.mozilla.org/en-US/docs/Web/JavaScript/Introduction_to_Object-Oriented_JavaScript

  

确保这指向正确的事情,无论如何   对象被实例化可能很困难。但是,有一个简单的   成语使这更容易。

var Person = function(firstName) {
  if (this instanceof Person) {
    this.firstName = firstName;
  } else {
    return new Person(firstName);
  }
}

为什么我们要回新人?

其他情况如何实际发生?

2 个答案:

答案 0 :(得分:2)

Person只是一个常规功能。不同之处在于如何调用它:

1)可以作为构造函数调用

 var p = new Person('Bill Gates');

构造函数中的this上下文是Person的一个实例。 this instanceof Person评估为true 在将函数作为构造函数调用时,将自动返回新创建的对象。

2)作为常规函数调用

var p = Person('Bill Gates');

this是严格模式下的Window对象或undefinedthis instanceof Person评估为false 但是,为了仍然在简单调用上接收对象,手动调用new Person(firstName)以返回正确的对象。

this post中查看更多详情。

答案 1 :(得分:0)

没有要求你的"班级"使用Person运算符调用函数new

如果是,则函数内this的值将是Person类的实例。

如果它不像var p = Person('Toskan')那样,则this的值将成为全局对象,并且原型不能正确设置为{{1对象。为了解决这个问题,该函数显式返回使用Person.prototype关键字调用函数的结果。