【发布时间】:2014-06-03 16:06:45
【问题描述】:
我最近一直在阅读“有效的 JavaScript”,我遇到了这个问题。
作者解释了使构造函数与新无关的重要性,因为如果开发人员忘记使用“new”关键字调用构造函数,则“this”指的是“Window”。这就说得通了。令我困惑的是他实施的目的。
他建议像这样设置您的构造函数。
var Person = function(name, age){
var that = this instanceof Person ? this : Object.create(Person.prototype);
that.name = name;
that.age = age;
return that;
}
这是有道理的。您检查“this”是否是 Person 的实例,这意味着它是使用“new”关键字调用的。如果不是,则创建一个与“this”执行相同操作的新对象并返回该对象。
我的问题是这样的。如果您正在设置一个与“this”执行相同操作的新对象,我们就不能不必担心是否通过前面的“this”调用构造函数并创建新对象。
var Person = function(name, age){
var that = Object.create(Person.prototype);
that.name = name;
that.age = age;
return that;
}
为什么要担心“this”和“new”,为什么不总是像上面那样创建我们的构造函数?
【问题讨论】:
-
是的,这是一种方法,虽然从技术上讲,当使用
new调用时,虽然您只使用一个对象,但会创建两个对象。 -
@TylerMcGinnis:一个是因为它是使用
new调用的,另一个是通过调用Object.create()。您只是忽略了从new创建的那个。 -
@Nit:我不想重新输入它。如果你能做到,但让它更彻底,我会给你+1。
-
@dandavis:不,它仍然继承自
Person.prototype。这是相同的结构,只是使用了不同的语法。 -
@dandavis:如果
Person被重新定义,那不会破坏继承。对新的Person.prototype的自然更新不会反映在已经构建的对象中,但是给函数命名不会改变这一事实,除非您正在谈论向Person.prototype添加属性 inside 构造函数,这会很奇怪。
标签: javascript oop