【问题标题】:How to give prototype method access to parent variables?如何让原型方法访问父变量?
【发布时间】:2011-11-22 03:24:37
【问题描述】:

我有一个可以对特定 DOM 元素执行方法的小库。看起来有点像这样:

//An accessor method for the library
window.$ = function(selector){
    var new_instance = new lib();
    return new_instance.init(selector);
}
//And the actual library...
function lib(){
    this.context = window;
    this.init = function(sel){
        this.context = document.querySelector(sel);
        return this;
    };
    this.addPlugin = function(name, fn){
        lib.prototype[name] = fn;
        return this;
    };
}

与 Prototype 或 jQuery 一样,您可以通过 $(_selector_) 调用选择元素。要将方法添加到库中,您将使用 lib.addPlugin(...) 方法。不幸的是,当我添加这样的方法时:

lib.addPlugin('foo',function(){
    console.log(this.context);
    return this;
});

THIS 关键字指的是window,而不是原始父库实例。我不太了解所有原型的工作原理,但我想知道是否有某种方法可以解决/修复这个问题。我希望新添加的方法能够引用父库的变量。

【问题讨论】:

  • 如果我将 lib.addPlugin('foo', ...); 替换为 $('body').addPlugin('foo', ...); Try it,您的代码对我有效。
  • 这很有趣。你知道为什么它在那种情况下有效,而在另一种情况下无效吗?
  • 在您的问题中,addPluginlib 实例的方法,而不是lib 本身的函数。如果修改like so,就可以使用lib.addPlugin('foo', ...);成功了。

标签: javascript prototype-programming


【解决方案1】:

不要在构造函数中重新定义函数,每次调用$都会创建一个闭包,这会占用大量内存。

无论如何,除了 addPlugin 是一个实例方法而不是我这样实现的静态方法之外,我没有看到任何其他问题:

function lib(){
this.context = window;
}

lib.addPlugin = function(name, fn){
  this.prototype[name] = fn;
  return this;
 };

lib.prototype.init = function(sel){
this.context = document.querySelector(sel);
return this;
};

jsfiddle:http://jsfiddle.net/rAasm/

【讨论】:

  • 构造函数中重新定义了哪个函数?
  • @ŠimeVidas initaddPlugin 在 OP 中
猜你喜欢
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 2015-12-01
  • 2020-02-13
  • 1970-01-01
相关资源
最近更新 更多