【问题标题】:IS OOP possible in Javascript?Javascript 中可以使用 OOP 吗?
【发布时间】:2023-03-07 02:51:01
【问题描述】:

我最近发现Javascript函数可以有类,所以我想知道OOP是否也可以通过javascript实现。是吗?如果是,您能否指出一些教程或网站,我可以从哪里开始?

【问题讨论】:

  • Javascript 是一种面向对象的语言;一切都是对象。因此,无论您愿意与否,您都可以使用它进行面向对象编程。令人惊讶的是,类与 OOP 几乎没有关系。
  • 阅读以下博客文章,了解为什么原型继承很重要:aaditmshah.github.io/why-prototypal-inheritance-matters

标签: javascript


【解决方案1】:

OOP 绝对是可能的。虽然 Javascript 没有像大多数 OO 语言那样的“类”,但它所拥有的就是所谓的“原型”。基本上,对象是根据其他对象而不是类来定义的。 (对象也可以在一定程度上模拟类,对于那些无法完全理解原型继承的人来说。)

人们可能会争辩说 JS 的 OO 能力超过了大多数语言,考虑到对象比在具有类的语言中发挥着更重要的作用。

【讨论】:

  • 用“大预算的 OO 语言”替换“大多数 OO 语言”
【解决方案2】:

OOP 是 Javascript 的核心,但它不是经典的 OOP。 Javascript 使用原型,而不是类。

Douglas Crockford 是 Javascript 天才,所以他的 Prototypal Inheritance in Javascript 是一个不错的起点。在 Google 上搜索 "Javascript OOP" 也可能会找到一些简洁的文章供您阅读——我喜欢 the article by Mike Koss

【讨论】:

  • Crockford 也是 Javascript 纳粹。不要把他所说的一切都当成福音。
【解决方案3】:

Javascript 本质上是一种 OOP 语言。正如其他人所说,它是无类的,但您可以选择创建对象的方式。

您可以创建利用不同类型继承的对象。

  1. 伪经典继承。在这里,您构建构造函数并使用 new 创建类。这看起来很像典型的基于类的 OOP。
  2. 原型继承。 - 这是许多其他答案所提到的。
  3. 功能继承。 - 在这种模式下,您可以利用闭包、匿名函数和策略性回报来创建真正私有和受保护的变量。

这些类型之间有相当多的交叉。可以说 Javascript 是一种非常灵活且功能强大的 OOP 语言。

我也在学习 JS 中的 OOP。这是我整理的一个函数继承示例:

jsFiddle

// Object constructor
var parent = function (initial) {
    var that, privateNumber, hiddenVar; 
    that = {};    

    // Public variables
    that.share = initial - 32;

    // Public methods
    that.getNumber = function () {
        return privateNumber;                
    };

    // Private properties
    privateNumber = initial; 
    hiddenVar = "haha can't get me";    

    return that;
};

// Second object constructor that inherits from parent
var child = function (initial) {
    var that, privateName;

    // Inherit from parent
    that = parent(initial);

    // Public methods
    that.getName = function () {
        return privateName;                
    };

    // Private poroperties
    privateName = "Ludwig the " + initial + "th";

    return that;
};

// Create objects
var newPar1 = parent(42);
var newPar2 = parent(10);   

var newChild1 = child(0);
var newChild2 = child(100);

// Output on the jsFiddle page refed above: http://jsfiddle.net/ghMA6/

【讨论】:

    【解决方案4】:
    【解决方案5】:
    【解决方案6】:

    是的。有可能的。我曾经使用 Script# 来构建 javascript 应用程序,它允许您编写 C# 代码并转换为 JavaScript。 这是一个很好的体验,尤其是对于大型项目,它会迫使你以 OOP 的方式来思考你的代码。

    可以在以下位置找到该工具:(它是开源的,但由 Microsoft 员工编写) http://scriptsharp.com

    如果你不熟悉 C#,也可以找到类似的用 Java 编写 javascript 的工具。

    如果您也不想使用这些,您可以研究它如何转换代码以了解它如何实现 OOP 功能。

    【讨论】:

      【解决方案7】:

      这是一个在javascript中使用库完成OO结构的示例(非必需,推荐)

      //Create and define Global NameSpace Object
      ( function(GlobalObject, $, undefined) 
      {
          GlobalObject.PublicMethod = function()
          {
              ///<summary></summary>
          }
      
          GlobalObject.Functionality = {}
      
      }) (GlobalObject = GlobalObject || {}, jQuery);
      
      //New object for specific functionality
      ( function(Events, $, undefined)
      {
          //Member Variables 
          var Variable; // (Used for) , (type)
      
          // Initialize
          Events.Init = function()
          {
              ///<summary></summary>
          }
      
          // public method
          Events.PublicMethod = function(oParam) 
          {
              ///<summary></summary>
              ///<param type=""></param>
          }
      
          // protected method (typically define in global object, but can be made available from here)
          GlobalObject.Functionality.ProtectedMethod = function()
          {
              ///<summary></summary>
          }
      
          // internal method (typically define in global object, but can be made available from here)
          GlobalObject.InternalMethod = function()
          {
              ///<summary></summary>
          }
      
          // private method
          var privateMethod = function()
          {
              ///<summary></summary>
          }
      
          Events.PublicProperty = "Howdy Universe";
      }) (GlobalObject.Functionality.Events = GlobalObject.Funcitonality.Events || {}, jQuery )
      
      // Reusable "class" object
      var oMultiInstanceClass = function()
      {
          // Memeber Variables again
          var oMember = null; // 
      
          // Public method
          this.Init = function(oParam)
          {
              oMember = oParam;
          }
      }
      

      这样做的优势在于它自动初始化 Global 对象,允许您保持代码的完整性,并根据您的定义将每个功能组织到一个特定的组中。

      这个结构很扎实,展示了你对 OOP 的所有基本句法知识,没有关键词。

      甚至还有一些巧妙的方法来设置界面。如果您选择走那么远,一个简单的搜索将为您提供一些很好的教程和提示。

      甚至可以使用 javascript 和 Visual Studio 设置智能感知,然后定义每个部分并引用它们,从而使编写 javascript 更简洁、更易于管理。

      根据您的情况使用这三种方法有助于保持全局命名空间清洁、保持代码井井有条并保持每个对象的关注点分离。如果使用正确。请记住,如果您不利用使用对象背后的逻辑,那么面向对象的设计将毫无用处!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-06
        相关资源
        最近更新 更多