1. ホーム
  2. javascript

[解決済み] JavaScriptで小文字の "f "を使った`new function()`のテスト

2022-10-26 04:10:09

質問

私の同僚は、JavaScript で新しいオブジェクトを定義するために、小文字の "new function()" を使用しています。 これは、すべての主要なブラウザーでうまく動作するようで、また、プライベート変数を隠すのにかなり効果的なようです。 以下はその例です。

    var someObj = new function () {
        var inner = 'some value';
        this.foo = 'blah';

        this.get_inner = function () {
            return inner;
        };

        this.set_inner = function (s) {
            inner = s;
        };
    };

this"が使われると同時に、それはsomeObjのパブリックプロパティになります。 つまり、someObj.foo, someObj.get_inner(), someObj.set_inner() は全て公開されていることになります。 また、set_inner()とget_inner()は特権メソッドなので、クロージャを通じて"inner"にアクセスすることができます。

しかし、このテクニックへの言及はどこにも見当たりません。 Douglas CrockfordのJSLintでさえも、それに文句を言っています。

  • 奇妙な構造。新しい」を削除してください。

このテクニックを本番で使っていて、うまくいっているようなのですが、どこにも文書化されていないので、ちょっと不安です。 どなたか、これが有効なテクニックかどうかご存じですか?

どのように解決するのですか?

そのテクニックは以前にも見たことがあります。 コンストラクタ関数 .

しかし、IMHOでは、自動起動する関数式で同じことが実現できます。 new 演算子を使う意味はないと思います。

var someObj = (function () {
    var instance = {},
        inner = 'some value';

    instance.foo = 'blah';

    instance.get_inner = function () {
        return inner;
    };

    instance.set_inner = function (s) {
        inner = s;
    };

    return instance;
})();

の目的は new 演算子は新しいオブジェクトのインスタンスを作成することであり、そのために [[Prototype]] 内部プロパティによって作られることがわかります。 [Construct] という内部プロパティがあります。

上記のコードで同等の結果が得られます。