2

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

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

4

2 回答 2

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

于 2012-08-08T07:28:15.310 回答
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);
于 2012-08-08T07:14:18.417 回答