带有和不带new运算符的JavaScript构造函数

时间:2016-01-21 23:22:33

标签: javascript constructor new-operator

以下两个代码块的工作区别是什么?两者似乎工作方式相似(我知道第一个是正确的,第二个不是,但差别是什么?)。

function Album(title, artist) {
    this.title = title;
    this.artist = artist;
    this.play = function() {
        console.log("Playing " + this.title + " - " + this.artist);
    };
}
var darkside = new Album("Dark Side of the Cheese", "Pink Mouse");
darkside.play();

使用相同的代码,但使用return this构造函数并创建没有new运算符的对象实例

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

1 个答案:

答案 0 :(得分:2)

这"工作"因为this没有new在浏览器上下文中解析为window,因此将title对象的window属性设置为title参数。

您应该使用new,以便在正确的上下文中构建它,并正确创建一个具有自己属性的新对象。

function Album() { alert(this==window); }; x = Album(); // true 
function Album() { alert(this==window); }; x = new Album(); // false

因此,如果您创建了另一个实例,this.title将覆盖之前的等等,并且您将不会有任何独立对象来存储title