0

2 つのプロパティを持つ 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

かどうかを確認できthisますinstanceof 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;
};

もう 1 つの可能性は、関数を厳密モードで実行することです。これはそのシナリオにあり、TypeError を引き起こしthisますundefinedが、サポートされている実装でのみ発生します。

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