带和不带新运算符的JavaScript构造函数
以下两段代码的工作有什么不同。这两种方法的效果似乎相似(我知道第一种方法是正确的,第二种方法是错误的,但区别是什么?) 和相同的代码,但是带带和不带新运算符的JavaScript构造函数,javascript,constructor,new-operator,Javascript,Constructor,New Operator,以下两段代码的工作有什么不同。这两种方法的效果似乎相似(我知道第一种方法是正确的,第二种方法是错误的,但区别是什么?) 和相同的代码,但是带的构造函数返回此并创建一个不带新运算符的对象实例 function Album(title, artist) { this.title = title; this.artist = artist; this.play = function() { console.log("Playing " + this.title
的构造函数返回此
并创建一个不带新
运算符的对象实例
function Album(title, artist) {
this.title = title;
this.artist = artist;
this.play = function() {
console.log("Playing " + this.title + " - " + this.artist);
};
return this;
}
var darkside = Album("Dark Side of the Cheese", "Pink Mouse");
darkside.play();
两者都返回相同的结果:
Playing Dark Side of the Cheese - Pink Mouse
这“起作用”是因为This
不带new
在浏览器上下文中解析为window
,从而将window
对象的title
属性设置为title
参数
您应该使用new
,以便在正确的上下文中构造它,并正确地创建具有自己属性的新对象
function Album() { alert(this==window); }; x = Album(); // true
function Album() { alert(this==window); }; x = new Album(); // false
因此,如果您创建了另一个实例,this.title
将覆盖上一个实例,依此类推,并且您将不会有任何独立的对象来存储title
。此“有效”因为此
不带新建
解析为浏览器上下文中的窗口
,因此将窗口
对象的标题
属性设置为标题
参数
您应该使用new
,以便在正确的上下文中构造它,并正确地创建具有自己属性的新对象
function Album() { alert(this==window); }; x = Album(); // true
function Album() { alert(this==window); }; x = new Album(); // false
因此,如果您创建了另一个实例,
this.title
将覆盖上一个实例,依此类推,并且您不会有任何独立对象来存储title
。第二个实例不会创建实例。它将属性添加到窗口
对象。如果您尝试在严格模式下运行该代码,它将崩溃,因为您将为未定义的
分配属性。第二个不会创建实例。它将属性添加到窗口
对象。如果您尝试在严格模式下运行该代码,它将崩溃,因为您将为未定义的
分配属性。我在节点中运行了all,而不是在浏览器中运行。所以,如果我们将窗口
与全局
交换,同样的逻辑也会起作用?@Alexander是的,同样的事情。我在节点中运行了所有操作,而不是在浏览器中。所以,如果我们将窗口
与全局
交换,同样的逻辑也会在那里工作?@Alexander是的,同样的事情。