0

如果我想创建一个具有两个属性的 javascript“类”,我可能会执行以下操作:

var Person = function (firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
};

然后我可以按如下方式创建一个新人:

var p = new Person("John", "Doe");
console.log(p.firstName + " " + p.lastName);

在这一点上,一切都很好。但是,如果有人意外(或故意)调用以下命令:

Person("Mary", "Smith"); // without "new"

突然之间,firstName并且lastName是全局窗口上下文的一部分,并且可能会搞砸整个页面。

console.log(window.firstName); // logs "Mary"

在构建“类”时,有没有一种好的方法可以防止这种情况发生Person?显然,如果有人想在 javascript 中破坏某些东西,他们可以做到,但我只是在寻找最佳实践。

我可以在班级的顶部抛出这样的东西,但我不知道这是否是一个好的答案:

if (this === window) {
    console.log("You are fail");
    return;
}
4

1 回答 1

3

你可以检查一下是否thisinstanceof Person

var Person = function (firstName, lastName) {
    if (!(this instanceof Person))
        throw "Person constructor called without \"new\"."
    this.firstName = firstName;
    this.lastName = lastName;
};

或者让它适当地调用构造函数。

var Person = function (firstName, lastName) {
    if (!(this instanceof Person))
        return new Person(firstName, lastName)
    this.firstName = firstName;
    this.lastName = lastName;
};

另一种可能性是让您的函数在严格模式下运行。这将导致thisundefined那种情况下,导致 TypeError,但仅在受支持的实现中。

var Person = function (firstName, lastName) {
    "use strict";
    this.firstName = firstName;
    this.lastName = lastName;
};
于 2012-05-09T00:05:50.307 回答