范围内对象内的对象问题

时间:2015-07-26 17:54:24

标签: javascript jquery

我在尝试构建一个简单的jQuery插件时遇到了一个问题,我想这与范围有关。

简单问题:类(A)创建一个对象(B),其中属性(C)被设置为类方法之一(D)。如何通过属性(C)访问对象(B)中未包含的A类方法?

更长的版本(下面的代码):我在插件中声明一个对象(让我们称之为publicMethods),由一堆方法组成。这些方法应该是一些默认方法(在插件中声明),或者用户声明的方法,如果用户在初始化插件时声明了自己的方法。

这个想法是,当用户定义自己的自定义方法时,该函数中应该有一些函数和变量可供她访问(如this.someVar)。

这会产生一些限制。

我希望默认方法可以访问一些内部函数和变量,而不包含在对象publicMethods中。但是当我通过它们所在的对象访问这些方法时,我没有直接调用它们,而是无法访问该对象内部的其他变量/函数。

我试图找到一种方法让默认方法可以访问它的类兄弟姐妹。我知道在调用方法之前我可以做一些条件语句(如果它是用户定义的),或者甚至声明一个指向"这个"的全局变量,但是我要保持它干净。

var Plugin = function (opt) {
    this.settings = $.extend({
        "someVar"   : "Value",
        "someFunc"  : null
    });

    this.anotherVar = "Hello World";
    this.setPublic();
    this.run();
}

Plugin.prototype = {
    setPublic: function() {
        this.publicMethods.someFunc = this.someFunc;
        if ($.isFunction(this.settings.someFunc)) {
            this.publicMethods.someFunc = this.settings.someFunc;
        } else {
            this.publicMethods.someFunc = this.someFunc;
        }
    },
    someFunc: function(arg) {
        return this.anotherVar; // returns type error the second time
    },
    run: function () {
        this.someFunc();
        this.publicMethods.someFunc();
    }
}

1 个答案:

答案 0 :(得分:1)

来自MDN:Function.prototype.bind()

  

bind()方法创建一个新函数,在调用时,将this关键字设置为提供的值,[...]。

所以以下内容应该有效:

setPublic: function() {
    this.publicMethods.someFunc = this.someFunc.bind(this);
    if ($.isFunction(this.settings.someFunc)) {
        this.publicMethods.someFunc = this.settings.someFunc.bind(this);
    }
    // This is redundant anyway:
    /* else {
        this.publicMethods.someFunc = this.someFunc.bind(this);
    }*/
},