我刚开始尝试围绕原型范例制作一个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 - 这是模块化我的代码的最佳方式,因此我可以将其分解为不同的文件。
感谢。
答案 0 :(得分:0)
相当广泛的问题,所以这里有一些要点
尝试像这样声明遥控
function Remote(){ ... }
这会在窗口中设置你的遥控功能(顶层"这个")所以你将有window.remote。
在构造函数中初始化变量。
使用new创建对象的实例,然后操作该实例。
你需要在远程实例中调用或者#34;这个"将默认为窗口对象, 你可以使用call,apply或bind来解决这个问题。
查看此链接以获得更深入的解释 http://phrogz.net/JS/classes/OOPinJS2.html
2检查模块化的自执行功能。例如,您可以执行类似
的操作(function myPrivateFunction() {
...
})()
这隔离了私有函数的范围,避免了污染全局命名空间。我强烈建议查看John Resig的书" Javascript Ninja的秘密"