这来自John Resig的Learning Advanced JavaScript#35 http://ejohn.org/apps/learn/#35,名为“当我们忘记使用new运算符时会发生什么?”。
所以他告诉我们名称变量(我假设是window.name)被覆盖了,但是
1)是否在功能User中完成了覆盖,即this.name
是否为name设置了新的全局值?
2)如何使用“新用户”(即构造函数?)来防止覆盖window.name变量?是因为“新用户”只是用户的一个实例,而window.name是全局的吗?
谢谢您的帮助。
function User(first, last){
this.name = first + " " + last;
}
window.name = "Resig";
var user = User("John", name);
assert( name == "John Resig", "The name variable is accidentally overridden." );
最佳答案
在没有User()
的情况下调用new
会使函数内的this
引用全局对象,该对象在浏览器中为window
。因此,name
对象的window
属性被覆盖。另请注意,user
将包含值undefined
,因为该函数不会返回值。
如果使用new
调用该函数,则this
将引用从User.prototype
继承的空对象。 window.name
保持不变,而是设置空对象的name
属性。该新对象也由该函数隐式返回,因此user
将对其进行引用。