JS prototype.namespace用于单独的文件问题

时间:2014-07-24 00:07:40

标签: javascript jquery plugins prototype

我刚开始尝试围绕原型范例制作一个jquery插件。

我这样的代码有效:

(function(window, $){

    var Remote = function(elem, options) {

        this.elem = elem;
        this.$elem = $(elem);
        this.options = options;

        this.p = [];

    };

    Remote.prototype = {
        defaults: {
            message: 'Hello world!'
        },
        init: function() {
            this.config = $.extend({}, this.defaults, this.options, this.metadata);

            ...
        },
        findPath: function() {

            var t = this.p.length;

            ...

        }
    };

    Remote.prototype.constructor = Remote;
    Remote.defaults = Remote.prototype.defaults;

    $.fn.remote = function(options) {
        return this.each(function() {
            new Remote(this, options).init();
        });
    };

})(window, jQuery);

所以现在我试图让它更加模块化,能够分成多个文件(如果我发现任何错误,请纠正我):

var Remote = function(elem, options) {

    this.elem = elem;
    this.$elem = $(elem);
    this.options = options;

    this.p = [];

};

Remote.prototype = {
    defaults: {
        message: 'Hello world!'
    },
    init: function() {
        this.config = $.extend({}, this.defaults, this.options, this.metadata);

        ...
    }
};

// I'd like to put this object into path.js
Remote.prototype.path = {
    find: function() {

        var t = this.p.length;
        // this.p is undefined

        ...

    }
};

Remote.prototype.constructor = Remote;
Remote.defaults = Remote.prototype.defaults;

(function(window, $){

    $.fn.remote = function(options) {
        return this.each(function() {
            new Remote(this, options).init();
        });
    };

})(window, jQuery);

通过Remote.prototype中的命名空间,我似乎已失去this的范围。

Q1 - this去了哪里? Q2 - 这是模块化我的代码的最佳方式,因此我可以将其分解为不同的文件。

感谢。

1 个答案:

答案 0 :(得分:0)

相当广泛的问题,所以这里有一些要点

  1. 尝试像这样声明遥控

    function Remote(){  ... }

  2. 这会在窗口中设置你的遥控功能(顶层"这个")所以你将有window.remote。

    在构造函数中初始化变量。

    使用new创建对象的实例,然后操作该实例。

    你需要在远程实例中调用或者#34;这个"将默认为窗口对象, 你可以使用call,apply或bind来解决这个问题。

    查看此链接以获得更深入的解释 http://phrogz.net/JS/classes/OOPinJS2.html

    2检查模块化的自执行功能。例如,您可以执行类似

    的操作
    (function myPrivateFunction() {
    ...
    })()
    

    这隔离了私有函数的范围,避免了污染全局命名空间。我强烈建议查看John Resig的书" Javascript Ninja的秘密"