0

javascript を使用して従来のコレクション/インスタンス モデルを作成しようとしています。したがって、 Collection オブジェクトには完全なコレクションを操作するためのメソッドがあり、 ((new Collection()) instanceof Instance) にはインスタンスを操作するためのメソッドがあります。私のコードはかなり単純です。

var Collection = function Collection() {
  this.message = "collection";
  var I = Instance.bind(null, this);
  I.__proto__ = this;
  return I;
};
Collection.prototype = {
  collectionMethod: function () {
    console.log(this.message);
  }
};

var Instance = function Instance(collection) {
  this.collection = collection;
  this.message = "instance";
};
Instance.prototype = {
  instanceMethod: function () {
    console.log(this.message);
  }
};

// Test exec (values are like expected);

var C = new Collection();
var i = new C();
C.collectionMethod(); // collection
i.instanceMethod(); // instance
i.collection.collectionMethod(); // collection
C.newMethod(); // TypeError
i.newMethod(); // TypeError
Collection.prototype.newMethod = Instance.prototype.newMethod = function () {
  console.log("newMethod: " + this.message);
}
C.newMethod(); // newMethod: collection
i.newMethod(); // newMethod: instance

しかし、proto は標準の一部ではなく、IE ではまったく機能しないため、使用したくありません。この場合、何か方法はありますか?


どういうことかについてのいくつかの説明。たとえば、ユーザーのコレクションがあるとします。そして、ユーザーを見つけて新しいユーザーを作成できるようにしたいと考えています。

したがって、次のような新しいコレクションを作成します

var User = new Collection();

次に、次のように新しいインスタンスを作成します。

var me = new User({name: "alex"});

そして今、あなたはこのインスタンスを次のように見つけます

User.find_by_name("alex"); // === me

User.newまた(実際、これが私がこのように使用する関数のようなものを作成するのではなく、この方法を行っている主な理由ですvar me = User.new({name: "alex"});)あなたは私が誰のようなことをしているのかを知ることができます(例えばあなたも持っている場合var Dog = new Collection()

me instanceof Dog // false
me instanceof User // true
4

2 に答える 2

0

なので今のところ無理みたいです。詳細については、こちらを参照してください。

JavaScript 関数を継承するにはどうすればよいですか?

于 2013-02-18T08:50:53.220 に答える
0

このコード:

var I = Instance.bind(null, this);
I.__proto__ = this;
return I;

本当に意味がありません。Function.bind は新しいfunctionを作成するため、 Collection 関数を呼び出す人は、何らかの方法で、プロトタイプが関数のプロトタイプに設定されているオブジェクトではなく、 functionを取得します。

一般に、プロトタイプが特定のオブジェクトに設定されているオブジェクトを作成する場合、それは標準ではないため、設定しません。__proto__最善の方法は、Object.create を使用することです (IE8 をサポートする場合は、これがシマブルです)。

var I = Object.create(this);

また、エラーが発生する理由は、プロトタイプに追加する前にnewMethodそれらを呼び出そうとしているためです。

Collection.prototype.newMethod = Instance.prototype.newMethod = function () {
  console.log("newMethod: " + this.message);
}
C.newMethod(); // should work now
i.newMethod(); // should work now
于 2013-02-15T07:49:47.437 に答える