javascript 'this' 链接代码

标签 javascript methods this

我正在尝试开发一个像 jQuery 这样允许链接的库。我已经有了可以工作的函数,但我需要将它们链接在一起。请查看下面的代码并帮助我解决如何使用“this”访问正确的上下文并开发一个允许链接的类似 jQuery 的库。我希望“learnQuery()”像 jQuery() 一样运行。我在将 cssClass 方法链接在一起时遇到问题。

function learnQuery(elementSelector) {
  'use strict';
  var learnQueryContext = this;

  function cssPropProxy(property, value) {
    return cssProp(elementSelector, property, value);
  }

  function ajaxReqProxy(url, options) {
    return ajaxReq(url, options);
  }

  var cssClass = new CssClass();

  return {
    cssProp : cssPropProxy,
    ajaxReq : ajaxReqProxy,
    cssClass: {
      add: function(setClass) {
        cssClass.add(elementSelector, setClass);
        return learnQueryContext;
      },
      remove: function(deleteClass) {
        cssClass.remove(elementSelector, deleteClass);
        return learnQueryContext;
      },
      toggle: function(toggleClass) {
        cssClass.toggle(elementSelector, toggleClass);
        return learnQueryContext;
      },
      has: function(hasClass) {
        cssClass.has(elementSelector, hasClass);
        return learnQueryContext;
      }
    }

最佳答案

是的,在尝试学习同样的东西之前,我正在玩类似的东西。我还保存着这个,看看你是否能理解:

var $ = (function(){
    $ = function(selector){ return new MyQuery(selector); };

var MyQuery = function(selector){
    var nodes   = document.querySelectorAll(selector);
    this.each   = Array.prototype.forEach.bind(nodes);
    this.map    = Array.prototype.map.bind(nodes);
    var len = this.length = nodes.length;
    for(var i = 0; i < len; i++) this[i] = nodes[i];
};

$.fn = MyQuery.prototype = {
    addClass: function(classes){
        this.each(function(el){
            classes.forEach(function(className){
                el.classList.add(className);
            });
        });
        return this;
    },
    removeClass: function(classes){
        this.each(function(el){
            classes.forEach(function(className){
                el.classList.remove(className);
            });
        });
        return this;
    },
    addAttribute: function(newAttrib, value){
        this.each(function(el){
            el.setAttribute(newAttrib, value);
        });
        return this;
    },
    removeAttribute: function(attrib, value){
        this.each(function(el){
            el.removeAttribute(attrib);
        });
        return this;
    },
    remove: function(){
        this.each(function(el){
            el.remove();
        });
        return this;
    },
    on: function(type, callback){
        this.each(function(el){
            el.addEventListener(type, callback);
        });
        return this;
    },
    append: function(elem){
        this.each(function(el){
            el.appendChild(elem);
        });
        return this;
    },
    css: function(prop, value){
        this.each(function(el){
            el.style[prop] = value;
        });
        return this;
    }
}
return $;
})();

关于javascript 'this' 链接代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28462751/

相关文章:

java - 何时以及如何在 Java 中使用 "return this"

jQuery .在悬停时附加此内容

从另一个类调用方法后,C# 设置 Form Parent

javascript - Protractor (用于测试 Angular growl )通过/失败不一致

javascript - angular-ui-router 1.0.x : event. preventDefault & event.defaultPrevented 替代

javascript - 这在Vue中是未定义的,使用debounce方法

python-3.x - 将列表从另一个类传递给类内的方法,以便修改所述列表并传回 Python 中的原始类

c# - 是否可以在 C# 中完成虚拟方法?

javascript - 使用加号按钮添加多个文本框并通过 PHP 提交

.net - 将 IDisposable 作为参数传递