Javascript 继承最佳策略

标签 javascript jquery inheritance refactoring

目前,我们已经构建了自己的 Javascript 框架,用于为复杂的 Web 应用程序构建小部件、div、面板和表单。我们所有的小部件(又名组件)都继承自一个名为 Viewable 的 super 对象,它主要定义一个 View ,它是一个 HTMLElememnt

Viewable = {
    getView: function() {
        if (!this.view)
            this.view = this.createView();
        return this.view;
    }
    createView: function() {
        alert(‘You have not implemented createView. You are a very naughty boy!);
    }
}

然后我们使用Object.create(Viewable)创建自己的组件,这些组件都需要实现Viewable中定义的createView

Header = Object.create(Viewable);
Header.createView = function() {
    var div = document.createElement('div');
    div.id = 'Header';
}

Header.foobar = function() {
}

我想摆脱这种类型的继承,这种动态创建对象,而只是根据我的心情添加方法。

我研究过使用 jQuery 中的 $.extends 的另一种方法。然后我可以创建我的对象(或者更好地说“定义我的函数”?“定义我的类”?)

function Header() {

    $.extend(true, this, Viewable);

    this.createView = function() {
        var div = document.createElement('div');
        div.id = 'Header';
    }

    this.foobar = function() {
    }
}

我想将我的代码重构为第二种方法,因为对我来说好处是:

  • 你得到一个构造函数
  • 有一定程度的封装
  • 它类似于 Java 等 OO 语言(我来自这个世界..)
  • 我的 IDE (Webstorm) 更喜欢这个用于智能感知和重构。

但我不确定。有什么缺点吗?我将不得不重构 50 多个文件,所以我对这样做有点紧张。我对 Javascript 还是比较陌生。

同时,我们也在讨论这个问题,这是一个快速的子问题。如果我将 Viewable 重构为如下所示:

function Viewable() {
    this.getView = function() {
        if (!this.view)
            this.view = this.createView();
        return this.view;
    },
    createView:function() {
        alert(‘You have not implemented createView. You are a very naughty boy!);
    }
}

这会更有益吗?我喜欢它,因为对我来说它使代码看起来一致。

最佳答案

JavaScript 没有类定义(还),没有接口(interface)。 根据心情添加方法原型(prototype)继承的工作原理。

使用 Object.create$.extend 不会改变这一点。

请记住,$.extend 不会为您提供继承树。 Header instanceof Viewablefalse,您只是复制在 Viewable 上定义的属性。 $.extend 就像修改输入参数的对象合并。

如果 instanceof 对您来说不重要,那么您可以使用任何一种方法。

关于如何在 JavaScript 中获取类定义,ES6 有一些很好的新想法。 ES6 尚未实现,但如果你想要一个可行的预览,你可以看看 Microsoft's TypeScript . TypeScript 并非 100% 兼容 ES6,但它在重要的地方兼容。

TypeScript 添加了类和接口(interface) 以及所有爵士乐。这会为您提供所需的类型提示,但在编译回 JavaScript 时会被删除。

关于Javascript 继承最佳策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23695462/

相关文章:

javascript - 无法使用js将HTML元素分配给变量

oop - 如何管理(或消除)并行的类层次结构?

javascript - 将类实例设置为对象(谷歌地图)

javascript - Kendo UI 网格标题在页面刷新时消失/移动

jQuery 点击事件奇怪的行为

javascript - 如何在不重复 Div 选择器的情况下设置 JQuery .show/.hide

C# GetMethod 不返回父方法

python - Python中如何继承和扩展类的属性?

javascript - window.open 无法正常工作,解析 URL 被 chop

javascript - 从元素中删除特定的 jQuery 单击事件