【问题标题】:How do I implement inheritance in javascript?如何在javascript中实现继承?
【发布时间】:2012-05-27 14:49:14
【问题描述】:

如何在 Javascript 中实现继承?我开始使用 Knockout.js 并实现 ViewModels/page。不过,我有一些函数/代码希望在所有 ViewModel 之间共享。

我想知道在这种情况下如何实现继承?

【问题讨论】:

  • here 你会找到你需要的。
  • 或者你可以采用coffeescript的方式,使用它的语法来创建类并相互继承。更多细节在 coffeescript.org 上。最后它编译成标准的 OO javascript,但是在处理类时它更容易读写。

标签: javascript jquery knockout.js


【解决方案1】:

继承可能不一定是答案。为什么不使用每个 ViewModel 应实现的所有方法创建一个对象字面量。我对淘汰赛不熟悉,但这是您可以在本机 js 中执行的操作。

    var sharedMethods = {
             run: function () {},
             jump: function () {}
        };

    function Person () {};
    // Use jQuery's extend method
    // Now person has run, jump, and talk
    $.extend(Person.prototype, sharedMethods, {
        talk: function () {}
    });

【讨论】:

  • 您提出的是在基于原型的 OO 中实际传递的继承(我支持您的解决方案)
  • 酷!我喜欢您的解决方案,并且易于理解和实施。
  • 在 js 中,我会在原型链之后调用实现继承。不仅仅是实现一组共享的方法。
  • 虽然已经有一段时间了,但我才意识到在最后一次修订之前,我实际上是在向共享方法对象添加方法。您必须先创建一个新对象,添加共享方法,然后再添加一组新方法,这样才能跨多种对象类型正常工作。
  • 如果我的编辑没有通过,变化是这样的:$.extend(Person.prototype, sharedMethods...
【解决方案2】:

JavaScript 提供原型继承。对象确实继承自其他对象。这对于方法继承来说可能很好,但它不适用于属性继承。

通常继承您可以使用的方法:

function BaseViewModel() { 
   var self = this;
   self.name = ko.observable();
}

function Person() {
   var self = this;
   self.firstname = ko.observable();
}

Person.prototype = new BaseViewModel();

但这会导致所有人共享同一个对象作为原型!当您更改一个人的名称时,该值会传播到所有人员。我倾向于使用 jQuery 的 extend 方法。

function Person() {
   var self = this;
   $.extend(self, new BaseViewModel());

   self.firstname = ko.observable();

}

这样,BaseViewModel 中的值会被复制到 Person。

【讨论】:

    【解决方案3】:

    Here's the link from crockford.com
    它是了解面向对象 Javascript 的最佳场所。
    虽然他的方法一开始并不复杂。它是最好的资源之一 因为他以持续参与 JavaScript 语言的开发、推广数据格式 JSON(JavaScript Object Notation)以及开发各种 JavaScript 相关工具(如 JSLint 和 JSMin)而闻名。

    【讨论】:

      猜你喜欢
      • 2013-07-25
      • 2017-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      • 2023-03-25
      • 2015-02-08
      相关资源
      最近更新 更多