集合/实例对象样式为没有proto的vie javascript
Collection/Instance objects style vie javascript without proto
我正在尝试通过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,因为它不是standart的一部分,在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
此代码:
var I = Instance.bind(null, this);
I.__proto__ = this;
return I;
真的没有多大意义。Function.bind创建了一个新的函数,因此任何调用Collection函数的人都将以任何方式返回函数,而不是原型设置为函数原型的对象。
通常,如果要创建一个原型设置为特定对象的对象,则不必设置__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
所以现在看来这是不可能的。更多信息可以在这里找到。
如何继承javascript函数?