【问题标题】:Javascript OO, issue going trough inheritanceJavascript TO,通过继承的问题
【发布时间】:2013-10-25 12:12:08
【问题描述】:

我有一个问题需要在 JS 中解决某种继承问题。

我设置了一个小jsfiddle来解释,看:

V1 http://jsfiddle.net/FFTj4/5/

function Vehicule(name) ...

这里的结果并不像预期的那样,但很容易解释。我正在调用父构造函数,将函数的作用域应用于设置名称的“调用”对象。到目前为止,汽车和跑车的名称还没有在他们的车辆原型中设置,所以当我询问名称时,车辆名称是未定义的。

我修复了它:

V2(在 jsfiddle 中取消注释 v2 部分) 好吧,现在我也在“确定” getName 调用以确保我得到了我的“名字”。我虽然它是固定的!所以我也将修复程序应用于 SportCar

V3(在 jsfiddle 中取消注释 v3 部分) 好吧,这不可能那么容易,现在我已锁定 SportCar 调用 Car getName,但汽车的范围仅限于 SportCar,因此当汽车“尝试”调用 Vehicule getName 时,它​​会改为调用 SPortCar getName,依此类推,超过了最大调用堆栈大小。

我需要想出一种方法来调用当前对象的超类,无论是否使用apply调用,当然要保持最顶层对象的范围:/

我的想法已经用完了,已经做了将近 2 周了。

谢谢!

【问题讨论】:

    标签: javascript oop inheritance


    【解决方案1】:

    排队:

    Car.prototype.superClass = Vehicule;
    

    你是assinning函数,不是实例,所以你不能调用

    this.superClass.prototype.getName();
    

    因为你没有上下文。没有创建对象。 你需要这样做:

    this.superClass.prototype.getName.call(this);
    

    然后它应该像你想要的那样工作:)

    但是,在你的代码中它不会工作,因为你覆盖了superClass。您需要为此使用“类”名称:

    Car.prototype.getName.call(this);
    

    或者只是不将superClass 分配给原型;)

    Here是对原型继承的简单解释。评论是波兰语,但 JS 是 JS ;)

    【讨论】:

    • 我可以,但这正是我不想做的,我不想像你建议的那样,必须明确地使用“父”类名来拨打电话。 (Car.prototype.xx),对我来说这应该不是问题,但是在我的团队中工作的开发人员不是 js 专家,使用起来也应该很方便。就像在“真实”语言中一样,您只需使用 super 关键字,无论它总是引用具有“子”范围的超类。
    • 所以你需要使用模块模式。例如:adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html
    • 老实说,切换到完全不同的模式对我来说并不是一个解决方案。这是一个很好的模式,但使用起来不方便。
    • 有很多不同的方式来实现模块模式。我只是给你一个例子。你也可以使用 jQuery 或 underscore.js。他们有extend 方法用于这样的目的。
    • 我会试一试,但到目前为止我还没有找到合适的模式来实现我的目标。使用原型可以很好地避免在内部克隆包含其整个“层次结构”的巨大对象,但是在保持正确范围的同时向上链是一种痛苦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多