【问题标题】:jQuery and object-oriented JavaScript - howto?jQuery 和面向对象的 JavaScript - 如何?
【发布时间】:2012-02-10 06:44:38
【问题描述】:

我已阅读 thisthis(感谢 google) 但这并没有足够的帮助。我想知道,如果直接开箱即用,没有任何插件插件,是否可以像使用原型一样做一些事情,例如:

MyClass = Class.create(Table,
{
  cookieName: 'w_myclass',
  prefix: 'myclass',
    ...blabla...

  // function
  initStr: function()
  {
    ...blabla...
  },

  // another function
  getIndice: function(param)
  {
    ...blabla...
    return 0;
  }

});

欢迎提出任何想法/建议。

【问题讨论】:

  • 为什么不使用 javascript 的原生面向对象特性?
  • JavaScript 几乎是“面向对象”的。你问的是基于类的继承,而不是面向对象。
  • 没有开箱即用的解决方案。但是还有另一种语言coffeescript.org,它可以一对一地编译成等效的JS,所以你可以在每个js框架中使用coffescript的特性

标签: javascript jquery oop


【解决方案1】:

JQuery 从来没有作为一个类框架的目的。它是关于页面操作和工具(如 AJAX)的。你可以用叉子敲钉子,但为什么不用锤子呢?

除非您是熟练的 JavaScript 程序员,否则使用原生 JavaScript 创建基于类的继承系统是自找麻烦。 Douglas Crockford will tell you it's possible,但他对闭包等的复杂性有深刻的理解。此外,如果您的系统变大,使用本机继承功能很快就会变得不可持续。

我强烈推荐 James Coglan 的 JS.Class 框架。类定义看起来与您的示例几乎相同。它不是原生 JS,但可以与 JQuery 很好地配合使用。

【讨论】:

    【解决方案2】:

    如果您想要一个使用 javascript 和 jquery 的近乎面向对象的解决方案,您可以在 javascript 中定义一个对象,该对象将设置您的事件控制器。

    这篇文章的后半部分http://www.codescream.com/?p=18 涵盖了这一点。但我会在这里写一份关于如何在 javascript 中创建一个可以在接近面向对象的结构中使用的对象的简历。

    看起来像这样:

    function myObject(constructorParam1, constructorParam2, anotherOne, blabla){
    
      var text = "";
      // this event will be set everyTime you run myObject
      $(".foo").click(function(){
        text = $(this).text(); // copies the text inside the elements ".foo" to a local variable
        doSomething();
      });
    
      function aPrivateFunction1(){
    
    
      }
    
      function aPrivateFunction2(){
    
      }
    
      function internalAdd(a,b){
        return a+b;
      }
    
      var size = 1; // privateVaribale
      var name = blabla;
    
    
      if(name===undefined){
         name="No name";
      }
    
      aPrivateFunction1(); // run "aPrivateFunction1()
    
      // you can consider all code above as being part of the constructor.
      // The variables declared above are private, and the functions are private as well
    
      // bellow are public functions  that you can access in an OOP manner
      return {
        getSize: function(){
            return size;
        },
    
        setSize: function(newSize){
            size = newSize;
        },
    
        getName: function(){
            return name;
        },
    
        setName: function(newName){ 
            name = newname;
        },
    
        addAndTurnPositive: function(n1,n2){
            var val = internalAdd(n1,n2);
            if(val<0){
                return val*-1;
            }
            return val;
        }
      }
    }
    
    // then you can run it like
    var anInstance = myObject("aaa",1234,"asdak",123);
    anInstance.setSize(1234);
    var t = anInstance.addAndTurnPositive(-5,2);
    

    【讨论】:

    • 我觉得这种事情对于不习惯处理闭包的新手 JS 程序员来说可能是非常令人反感的。一位聪明的同事曾经告诉我,你的目标应该是永远不要在原生 JavaScript 之上编写任何东西。找到一个框架。
    • 他问如何以更面向对象的方式使用 javacript。就是这样:p,我不同意你刚才所说的。
    • 没关系。这是我的看法,但我认为这是很多人都同意的。
    • 这不是因为你是“许多人”的一部分,它不可避免地证明你是对的。机会更高,但这不是一个事实上的结论。 fmsf 是对的:我一直在寻找一种用 jQuery 编写“面向 javascript”的方法,如果不存在任何东西(看起来是这样),那么他的示例正是我想要的。谢谢你的建议托尼,谢谢你的回答,fmsf。我喜欢K.I.S.S。我是一个 JavaScript 新手,所以我将开始用这种方式编写面向对象的代码,尽管这可能不是最好的选择。
    • @OlivierDofus 谢谢 :) 但如果这是您的“正确答案”,请将其标记为
    【解决方案3】:

    总之,没有。 jQuery 不提供任何类和继承功能。您需要包含另一个库,例如 klass(尽管有一个 jQuery plugin 与 jQuery 更紧密地联系在一起)

    【讨论】:

    猜你喜欢
    • 2011-04-28
    • 2011-02-02
    • 2010-10-22
    • 1970-01-01
    • 2023-04-09
    • 2010-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多