我的术语有点偏离,所以请在必要时自由纠正.我想重载
JavaScript中的一个函数和“基类”,以使用重载方法以及继承的类来访问基类方法.到目前为止,我想出了一个(工作)混合的jquery.extend()和对象文字,但这看起来不漂亮.我想知道是否有更好的方法(可以使用jquery).
var Base = new function(args,m) { $.extend(this,m); var self = this; this.bar = function() { self.foo(); } this.foo = function() { self.blah(); } this.dosomething = function() {} }; var Child = function(arg1) { $.extend(this,new Base(args,{ blah: function() { self.dosomething() } })); }
解决方法
您正在寻找的是一种跨对象共享功能的方法.
这正是JavaScript原型继承模式所擅长的一种.
这正是JavaScript原型继承模式所擅长的一种.
没有必要使用jQuery或其他库来完成这一点.考虑用语言的方式去做事情.
原型
在JavaScript中,对象具有“原型”.当JavaScript寻找一个没有它的对象中的方法时,它会在原型’chain’上查找它.所以你需要做的就是在该链的较低级别覆盖该功能.
这在the tutorial about it on MDN.中有详细的解释
你的具体情况
如果我想要一个Base和Child类,那么Base有一个Child需要覆盖的方法,我们需要做的就是把它分配给该链的任何地方.
查找的顺序是
Child Object --> Child's prototype (a Base object) --> Base's prototype (an Object)
例如,假设你有一个类Base
function Base(){ } Base.prototype.bar = function() { //bar logic here console.log("Hello"); }; Base.prototype.foo= function() { //foo logic here }; Function Child(){ } Child.prototype = new Base();
我想要孩子不同地实施吧,在这种情况下我可以做
Child.prototype.bar = function(){ console.log("World"); }
这导致了
var a = new Base(); a.bar(); //outputs "Hello" to the console var b = new Child(); b.bar(); //outputs "World" to the console //The Base instance that is the prototype of b has the bar method changed above
注意在JavaScript中的抽象类
抽象方法继承的两个主要原因是在基于经典继承(如Java)的语言中使用的是多态和代码共享.
在JavaScript中既不是问题.代码共享可以使用原型继承一样简单.无论如何,您可以接受任何功能,并在另一个上下文中运行它.例如,我甚至可以通过b.bar.call([])调用一个空对象的一个Child对象的bar方法.
至于多态性JavaScript是一种动态的鸭型打字语言.这意味着它会根据他们的能力来查看对象,而不是它们被声明的方式.如果几个对象有一个名为bar的方法,我将在每个对象上使用该方法,如果它们在数组或其他集合中.在需要通用接口,类型或祖先的Java中.
由于这些原因,像抽象类这样的东西在JavaScript中不会起很大的作用.