我刚读完Mike Koss on Object Oriented Programming in JavaScript。他简要地讨论了关于“替代子分类范式”的子分类和触及。在这个例子之后,Koss写道......
不幸的是,这种技术没有 允许使用
instanceof
运算符来测试a的成员资格 超一流的。但是,我们补充说 我们可以从更多的利益中获益 超过一个超级(多个 继承)
......它让我思考。多重继承的想法似乎很酷!所以我有两组问题:
instanceof
运算符以将其功能扩展为多重继承?答案 0 :(得分:2)
javascript中的模拟多重继承成为一场噩梦。
我编写了一个完整的自定义类包装器以允许动态多重继承,并且我在一个月之后放弃了它,因为它不值得。复杂性变得无法控制。
而不是使用多重继承,您可以使用它的父方法扩展您的对象。
我建议你坚持使用简单的对象构造函数和原型,而不是包含外部的“经典OO”模拟器。 JavaScript主要关注原型OO,它是从另一个对象继承而不是扩展另一个类的类。
如果您希望多重继承坚持对象组合。
警告:为简单起见,使用_
。
function Child() {
var parent1 = new Parent1();
var parent2 = new Parent2();
// bind this to parent1 so it's got it's own internal scope
_.bindAll(parent1);
_.bindAll(parent2);
// extend this with parent1 and parent2
_.extend(this, parent1);
_.extend(this, parent2);
}
是的,你失去了instanceof
检查。处理它。
更一般地说,您可以扩展您想要的任何对象。
function extend(f, arr) {
// return a new function to replace f.
return function() {
// store the correct this value
var that = this;
// call original f
f.apply(this, arguments);
// for each parent call it with the original this
_.each(arr, function(v) {
v.apply(that, arguments);
});
// add f to the parent array
arr.push(f);
// store the array on the object to use with instance_of
this.__instance = arr;
}
}
function instance_of(o, klass) {
// is the klass included in the .__instance array ?
return _.include(o.__instance, klass);
}
function Child() {
// do stuff
this.method = function() { console.log("method"); return this;};
}
function Parent1() {
this.foo = function() { console.log("foo"); return this; };
}
function Parent2() {
this.bar = function() { console.log("bar"); return this;};
}
Child = extend(Child, [Parent1, Parent2]);
var c = new Child();
console.log(instance_of(c, Parent1)); // true
console.dir(c);
c.method().foo().bar();
这依赖于underscore.js
来实现一些很好的抽象来保持示例代码的小。 .extend , .bindAll。
请参阅live example
答案 1 :(得分:1)
John Resig's class structure以及许多其他人都允许进行检查。
你不会因为考虑重写的实例而疯狂(我实际上是赞美你的想法,这是我要做的事:)),但这是不可能的。 instanceof不是函数,它是由编译器解析的javascript关键字,因此无法覆盖。
至于多重继承,没有人在实践中使用它,因为无法跟踪。当两个父类实现相同的事情时会发生什么?哪个优先?你如何区别于儿童班?