我想用JavaScript做简单的经典继承。我只需要子类和方法覆盖,而不是prototype.js或其他一些库提供的详细语法和花哨。
现在,这个名叫Shelby S. Moore的人已经提出了一个解决方案,它的工作方式与我想要的方式相同: http://www.coolpage.com/developer/javascript/Correct%20OOP%20for%20Javascript.html
唯一的问题是他正在扩展本机类型Object和Function,这会破坏我使用的一些库。另外作为一般观察,我不想搞乱本机对象的原型。
我让Shelby S. Moore的例子住在这里: http://jsfiddle.net/christian1974/CEKL5/
从示例中可以看出它按预期工作。 现在,$ 64.000的问题是:你能推荐一种让它工作而不会弄乱Object.prototype和Function.prototype的方法吗?
我一直在寻找一个非常简单的语法:
Extend(parent, this);
我应该放弃整个想法并使用现有的库来执行此操作吗?我为自己的生活太难了吗?
答案 0 :(得分:1)
function extend(Child, Parent) {
var F = function() { };
F.prototype = Parent.prototype;
Child.prototype = new F();
Child.prototype.constructor = Child;
Child.superclass = Parent.prototype;
}
用法:
function Parent() {}
Parent.prototype.hello = function(name) {
alert('hello ' + name);
}
function Child() {
Child.superclass.hello.call(this, 'world');
}
extend(Child, Parent);
答案 1 :(得分:1)
为什么不,而不是增加对象原型,只需创建一个函数inherits
?
function inherits(parent)
{
//just make sure this doesn't get called on the global object (like a regular function)
//and the parent is an actual constructor reference
if (this === window || typeof parent !== 'function')
{
throw new Error('inherit not possible on window/without constructor');
}
//to set the constructor dynamically and secure the constructor of child object
//I'd say this should do the trick (be weary though, not tested)
var constr, Proto;
constr = this.constructor;
Proto = typeof parent === 'function' ? new parent : parent;//get instance
this.prototype = Proto.prototype;
this.constructor = constr;//restore constructor when needed
if( arguments.length > 1 )
{
return parent.apply( this, Array.prototype.slice.call( arguments, 1 ) );
}
return parent.call( this );
}
function Foo(someArg)
{
inherits.apply(this,[Bar,someArg]);
}
话虽如此,我并没有真正看到这种方法的好处,比如,Object.create
和 - 因为你正在使用libs-jQuery的.extend
方法