【问题标题】:Javascript plugins design pattern like jQuery像 jQuery 这样的 Javascript 插件设计模式
【发布时间】:2010-05-20 11:37:01
【问题描述】:

有人可以用 javascript 写一个非常简单的基本示例来概念化(并希望让我理解)jQuery 插件设计模式是如何完成的以及它是如何工作的吗?

我对如何为 jQuery 创建插件不感兴趣(所以这里根本没有 jQuery 代码)。 我对一个简单的解释(可能带有一些 Javascript 代码)感兴趣,以解释插件概念是如何完成的

请不要回复我去阅读jQuery代码,我试过了,但我太复杂了,否则我不会在这里发布问题。

谢谢!

【问题讨论】:

    标签: javascript plugin-pattern


    【解决方案1】:

    jQuery 有一个存储在名为fn 的内部对象中的函数库。这些是您可以在每个 jQuery 对象上调用的对象。

    当您执行$("div.someClass") 时,您将获得一个包含该类的所有<div> 元素的jQuery 对象。现在您可以使用$("div.someClass").each( someFunction )someFunction 应用于每个人。这意味着,each() 是存储在 fn 中的函数之一(在这种情况下是内置函数)。

    如果您扩展(添加到)内部 fn 对象,那么您将自动使您的自定义函数可用于相同的语法。假设您有一个将所有元​​素记录到控制台的函数,称为log()。您可以将此函数附加到$.fn,然后将其用作$("div.someClass").log()

    附加到fn 对象的每个函数都将以这样的方式调用,即 函数体中,this 关键字将指向您使用的jQuery 对象。

    通常的做法是在自定义函数的末尾返回this,这样方法链就不会中断:$("div.someClass").log().each( someFunction )

    有几种方法可以将函数附加到$.fn 对象,有些方法比其他方法更安全。一个非常安全的做法是:

    jQuery.fn.extend({
      foo: function() {
        this.each( function() { console.log(this.tagName); } );
        return this;
      }
    })
    

    【讨论】:

      【解决方案2】:

      Tomalak 已经发布了您需要知道的几乎所有内容。

      还有最后一件事可以帮助 jQuery 使用 this 关键字来解决问题。

      这是一个叫做apply()的方法

      var somefunction=function(){
      alert(this.text);
      }
      var anObject={text:"hello"};
      
      somefunction.apply(anObject);
      //alert "hello" will happen
      

      它确实有助于创建抽象,以便框架/插件用户只需按照直觉告诉他们使用 this,无论您的代码中有什么

      【讨论】:

        【解决方案3】:

        与许多其他 js 框架一样,它使用 javascript 原型方向来工作。

        例如你可以声明一个简单的函数

        var alertHelloWorld = function() {
            alert('hello world');
        }
        

        然后将其绑定到现有对象(包括 DOM 节点)

        document.doMyAlert = alertHelloWorld;
        

        如果你这样做

        document.doMyAlert();
        

        alertHelloWorld 函数将被执行

        您可以阅读有关 javascript 对象原型设计的更多信息here

        【讨论】:

        • 不幸的是,您的示例根本没有使用原型设计。这是因为在 JavaScript 中,函数是第一类对象,可以像任何其他变量一样传递和分配。
        • 是的,原型对象存在于这样声明的对象上,它以类似的方式工作。我可以从底部链接 Object.prototype.inObj = 1; 复制/粘贴函数 A() { this.inA = 2; } A.prototype.inAProto = 3; B.原型=新A; // 将 A 连接到 B 的原型链 B.prototype.constructor = B;函数 B() { this.inB = 4; } B.prototype.inBProto = 5; x = 新 B; document.write(x.inObj + ', ' + x.inA + ', ' + x.inAProto + ', ' + x.inB + ', ' + x.inBProto);
        猜你喜欢
        • 2011-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-17
        相关资源
        最近更新 更多