5

私はいくつかの Backbone.js チュートリアルを読んでフォローしてきましたが、モデルのデフォルトに関しては、人々は 2 つの方法のいずれかを行っているようです。

最初の方法 - デフォルトはオブジェクトです

最初の方法は、デフォルトをオブジェクトとして宣言することです。

my_model = Backbone.Model.extend({
    defaults: {
        title: 'Default Title'
    }
});

これは私にとって最も理にかなっています。デフォルトがオブジェクトであり、正常に機能することがすぐにわかります。

第 2 の方法 - デフォルトは機能です

私が見た 2 番目の方法は、たとえば、デフォルトが関数として宣言されていることです。

my_model = Backbone.Model.extend({
    defaults: function() {
        return {
            title: 'Default Title'
        }
    }
});

この関数は明らかにオブジェクトを返すことになり、私にはほとんど意味がありません (最終的に関数に何かを渡したい場合を除きます。

私の質問

私の質問は、関数の方法を使用してパラメーターを渡さないと仮定して、一方を他方よりも使用する利点があるかどうかです。匿名関数を呼び出すことによるわずかなオーバーヘッドがあるかもしれませんが、より多くの情報に基づいた意見が欲しいと思っています。

4

3 に答える 3

6

JavaScript では、オブジェクトは参照によって渡されることに注意してください。そのため、オブジェクトをデフォルト値として含めると、すべてのインスタンスで共有されます。すべてのインスタンス間でオブジェクトを共有したくない場合は、参照によって渡されるオブジェクトを含むデフォルトを関数を使用して定義する必要があります

https://github.com/documentcloud/backbone/issues/1145

かなりそれを要約します。関数メソッドは、オブジェクト属性がある場合にのみ推奨されます。

于 2013-06-26T11:20:07.027 に答える
1

あなたが説明した2つのテクニックの間にパフォーマンスの違いはないと思います。デフォルトが解決される方法 (= 関数が呼び出されるか、単にオブジェクトが返されるか) は、underscore.js の次の行によって決定されます。

return _.isFunction(value) ? value.call(object) : value;

利点については。通常のオブジェクトは、モデルのデフォルトを宣言する静的な方法を提供します。拡張時にそれらを宣言するだけで、変更されません。一方、関数は、関数が返すはずのオブジェクトを変更することにより、クラス全体を再作成せずにフライのモデルのデフォルトを変更する機能を提供します。

于 2013-06-26T11:22:07.130 に答える