Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带和不带新运算符的JavaScript构造函数_Javascript_Constructor_New Operator - Fatal编程技术网

带和不带新运算符的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是的,同样的事情。