3

コンストラクター関数をインスタンス化して、独自の _proto_ プロパティを持ち、コンストラクター関数にプロパティ 'prototype' を与える JavaScript で新しいオブジェクトを作成できることを理解するようになりました。

function MyController() {
    var controllerName = 'initialcontroller';
    function init() {
        console.log(controllerName);
    }
    this.init = init;
}

ここで、init は次のように呼び出すことができます。

var mycontroller = new MyController();
mycontroller.init();    

MyController.prototype によって提供されるすべてのプロトタイプ プロパティを使用するつもりがない場合、インスタンス化を 1 回だけ実行し、二度と実行しないと仮定すると、これはやり過ぎではありませんか?

質問: 代わりに、公開モジュール パターンを使用してこのようにコーディングすることはできませんか?

var myController = function() {
    var controllerName = 'initialcontroller';
    function init() {
        console.log(controllerName);
    }
    return {
        init : init
    }
}();

ここで、init は次のように呼び出すことができます。

myController.init();

この場合、存在しない myController 内のプロパティにアクセスしようとすると、javascript エンジンはそのプロパティがプロトタイプ チェーンのどこかに存在するかどうかを調べようとしないため、時間を節約できます。

または、私が見落としている関数をインスタンス化することの他の利点はありますか?

4

1 に答える 1

2

いくつかのメソッドやその他のプロパティを持つ「シングルトン」のようなオブジェクトが必要な場合は、オブジェクト リテラルを使用してさらに単純化できます。

var myController = {
    init: function (foo) {
        // do something with foo or whatever
    }
}

myController.init("bar");

または、「プライベートな」内部状態が必要な場合は、通常の公開モジュール パターンを使用します。

var myController = (function () {
    var internal = "i am private";
    return {
        init: function () {
            // blah blah
        }
    };
}());

myController.init();

プロトタイプ ルックアップ時間について: ええ、理論的には、存在しないプロパティにアクセスしようとすると、ルックアップはプロトタイプ チェーンをたどります。理論的には、これは、特定のコンストラクターが「ない」単純なインスタンスの場合、少し高速になる可能性があります。Object実際には、このパフォーマンスへの影響はごくわずかです。本当に必要でない限り、ここで最適化を試みないでください。:)

于 2013-07-08T07:55:02.587 に答える