代码之家  ›  专栏  ›  技术社区  ›  Starx

在Javascript中OOP是可能的吗?

  •  7
  • Starx  · 技术社区  · 14 年前

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

    7 回复  |  直到 14 年前
        1
  •  8
  •   cHao Hammerite    14 年前

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

    有人可能会说JS的OO能力超过了大多数语言,因为对象比类语言更重要。

        2
  •  6
  •   Matchu    14 年前

    Douglas Crockford是Javascript天才,所以他的 Prototypal Inheritance in Javascript "Javascript OOP" 可能会出现一些整洁的文章细读,以及我喜欢的 the article by Mike Koss .

        3
  •  3
  •   Peter Ajtai    14 年前

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

    1. 原型遗传。-这是许多其他答案提到的。
    2. 功能性遗传。-在这种模式下,您可以使用闭包、匿名函数和策略返回来创建真正私有和受保护的变量。

    这些类型之间有相当多的交叉。可以说Javascript是一种非常灵活和强大的面向对象语言。

    我也在学习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/
    
        6
  •  0
  •   ZijingWu    11 年前

    对。这是可能的。我曾经使用脚本来构建javascript应用程序,它允许您编写C代码,并将其转换为javascript。 这是一个很好的经验,特别是对于大型项目,它将迫使你的思维在面向对象的方式来订购你的代码。

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

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

        7
  •  0
  •   Brett Weber    10 年前

    下面是一个在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;
        }
    }
    

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

    这个结构是坚实的,提供了所有的基本语法的东西,你会期望从面向对象编程没有关键字。

    甚至可以使用javascript和visualstudio设置intellisense,然后定义每个片段并引用它们,这样编写javascript就更干净、更易于管理。

    根据您的情况使用这三种方法有助于保持全局命名空间的整洁,保持代码的组织,并保持每个对象关注点的分离。。如果使用正确。记住,如果你不利用使用对象背后的逻辑,面向对象的设计是没有用的!