【问题标题】:"this" does not return the selector [duplicate]“this”不返回选择器[重复]
【发布时间】:2014-02-08 13:37:26
【问题描述】:

我有一个简单的库来选择一个元素并返回元素的对象。

(function() {
    var $ = function(parameter) {
        return new js(parameter);
    };

    var js = function(parameter) {
        var selector;
        selector = document.getElementById(parameter);
        this = selector; // assign selector to this.

        return this;
    };

    // Extend the library.
    $.fn = js.prototype = {
        hide: function() {
            this.style.display = 'none';
            return this;
        }
    };

    if (!window.$) {
        window.$ = $;
    }
})();

当我使用它时。

HTML

<div id="box"> Hello world! </div>

Javascript

$('box').innerHTML = "Good";

注意:我想这样做create a simple JavaScript library
阻止运行代码的问题是什么?

【问题讨论】:

  • 你不能给this分配任何东西。
  • @basilikum: this = selector;.
  • 是的,这正是你不能做的。请参阅 Tibos 的答案。
  • @LionKing:这是不允许的。

标签: javascript oop object


【解决方案1】:

您不能将内容分配给this。抛出的错误取决于浏览器。

相反,您可以简单地返回选择器:

var js = function(parameter) {
    var selector;
    selector = document.getElementById(parameter);

    return selector;
};

这将覆盖用 new 调用的一般机制,甚至可以使用您编写代码的方式。看到你没有使用函数作为构造函数,你也可以避免使用 new:

var $ = function(parameter) {
    return js(parameter);
};

【讨论】:

  • Error: Cannot assign to 'this' 在执行时并不是真的静默……不过,这不是语法错误。
  • 你也可以避免整个函数表达式 = var $ = js.
  • @Bergi 谢谢,我修复了失败的问题。至于另一个建议,我会假设还有更多代码,否则 OP 完全可以在没有 var js 的情况下完成。
  • @Tibos:但是如果我使用你的代码,我认为它就像一个函数。我想创建一个库而不仅仅是一个函数。
  • @LionKing 是的。这并不奇怪,看看它是如何 是一个函数。为什么你认为你需要使用 new/this ?也许问题就在那里。
【解决方案2】:

您将选择器分配给this,这是无效的,并且您正在创建一个不需要的对象。您的代码可以简化为:

(function() {
    var $ = function(parameter) {

        return document.getElementById(parameter);
    };

    if (!window.$) {
        window.$ = $;
    }
})();

【讨论】:

  • 既然我们要剪掉 OP 的代码片段,或许我们可以将其优化为这一行:window.$ = window.$ || document.getElementById.bind(document);
  • 不错!我喜欢简洁...改进你的答案
猜你喜欢
  • 2012-07-14
  • 2023-03-20
  • 1970-01-01
  • 2018-03-06
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多