JavaScript子类化和方法重写

时间:2012-08-08 07:10:33

标签: javascript inheritance

我想用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);

我应该放弃整个想法并使用现有的库来执行此操作吗?我为自己的生活太难了吗?

2 个答案:

答案 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方法