0

我正在尝试通过 javascript 制作经典的 Collection/Instance 模型。所以 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

这段代码:

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

真的没有多大意义。Function.bind 创建一个新的function,所以任何调用你的 Collection 函数的人,无论如何都会得到一个function,而不是一个原型被设置为函数原型的对象。

一般来说,如果你想创建一个原型设置为特定对象的对象,你不要设置__proto__,因为这不是标准的,正如你所说的。最好的方法是只使用 Object.create (如果你想支持 IE8,这是 shimable )。

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 回答
0

所以目前看来是不可能的。更多信息可以在这里找到。

如何继承 javascript 函数?

于 2013-02-18T08:50:53.220 回答