2

よ、

私の質問は、javascript オブジェクトに関するものです。

backbone.js コードを読みましたが、モデルとオブジェクトが javascript オブジェクトを使用してオブジェクトを定義していることがわかります。

そのように

Backbone.Model.extend({
    initialize: function() { ... },
    author: function() { ... },
    coordinates: function() { ... },
    allowedToEdit: function(account) {
        return true;
    }
});

プロトタイプを使用しないのはなぜですか? クラスごとに再定義されたメソッドだからですか?作成された各オブジェクトは backboneJS よりも多くのスペースを取るためですか?

いつ、なぜプロトタイプを使用するのが興味深いのか、誰かが私に説明できるなら?

4

3 に答える 3

2

Backbone USEでオブジェクトを作成するために使用する extends メソッドは、prototype を使用します。表示されないだけです。
他の質問については、最初の質問と同じように正しく理解できたと思います:)。また、私が見たいくつかのベンチマークから、多くのオブジェクトをインスタンス化する場合、prototype を使用する方が高速です。つまり、シングルトンを使用する場合は、静的プロパティ (extend(protoProp, staticProp)) を使用することをお勧めします。

関連するバックボーンのコード (拡張機能定義):

var Surrogate = function(){ this.constructor = child; };
Surrogate.prototype = parent.prototype;
child.prototype = new Surrogate;

// Add prototype properties (instance properties) to the subclass,
// if supplied.
if (protoProps) _.extend(child.prototype, protoProps);
于 2013-04-04T08:00:02.397 に答える
1

あなたは誤解しているようです。ソースコードは次のとおりです。

var extend = function(protoProps, staticProps) {
    var parent = this;
    var child;

    // The constructor function for the new subclass is either defined by you
    // (the "constructor" property in your `extend` definition), or defaulted
    // by us to simply call the parent's constructor.
    if (protoProps && _.has(protoProps, 'constructor')) {
      child = protoProps.constructor;
    } else {
      child = function(){ return parent.apply(this, arguments); };
    }

    // Add static properties to the constructor function, if supplied.
    _.extend(child, parent, staticProps);

    // Set the prototype chain to inherit from `parent`, without calling
    // `parent`'s constructor function.
    var Surrogate = function(){ this.constructor = child; };
    Surrogate.prototype = parent.prototype;
    child.prototype = new Surrogate;

    // Add prototype properties (instance properties) to the subclass,
    // if supplied.
    if (protoProps) _.extend(child.prototype, protoProps);

    // Set a convenience property in case the parent's prototype is needed
    // later.
    child.__super__ = parent.prototype;

    return child;
};

紛らわしいかもしれませんが、ここでの本質は、Backbone の.extendメソッドが新しい関数を作成し、渡されたオブジェクトをそのプロトタイプに割り当てて返すということです。

2 番目の質問については、同じ機能を共有する複数のオブジェクトを扱う場合は、常にプロトタイプを使用してください。

于 2013-04-04T08:01:06.180 に答える
0

ここではモデルを拡張していますが、これには JS オブジェクトを使用しても問題ありません。ただし、OOP クラス、インターフェイス、またはライブラリを実装する場合は、JS プロトタイプを使用してください。

于 2013-04-05T17:51:20.403 に答える