JavaScript中嵌套名称空间中的继承
我想设置嵌套的名称空间来组织代码。我试图遵循中描述的插件式结构。问题是,在我的示例中,我不理解如何访问这个错误。我的设置正确吗?我必须使用jQueryJavaScript中嵌套名称空间中的继承,javascript,jquery,namespaces,scope,javascript-namespaces,Javascript,Jquery,Namespaces,Scope,Javascript Namespaces,我想设置嵌套的名称空间来组织代码。我试图遵循中描述的插件式结构。问题是,在我的示例中,我不理解如何访问这个错误。我的设置正确吗?我必须使用jQuery.extend或.prototype来访问这个错误吗 (function(TC, $, undefined){ TC.ajax = function() { this.error_msg = 'default error...'; }; TC.ajax.run = function(){
.extend
或.prototype
来访问这个错误吗
(function(TC, $, undefined){
TC.ajax = function() {
this.error_msg = 'default error...';
};
TC.ajax.run = function(){
//do stuff...
TC.ajax.handle_error();
};
TC.ajax.handle_error = function(){
alert(this.error_msg);
};
}(window.TC = window.TC || {}, jQuery));
// Test it
TC.ajax.run();
演示:我认为您的代码必须如下所示:
(function(TC, $, undefined){
_this = this;
TC.ajax = function() {
_this.error_msg = 'default error...';
};
TC.ajax.run = function(){
//do stuff...
TC.ajax.handle_error();
};
TC.ajax.handle_error = function(){
alert(_this.error_msg);
};
}(window.TC = window.TC || {}, jQuery));
// Test it
TC.ajax.run();
我认为您的代码必须如下所示:
(function(TC, $, undefined){
_this = this;
TC.ajax = function() {
_this.error_msg = 'default error...';
};
TC.ajax.run = function(){
//do stuff...
TC.ajax.handle_error();
};
TC.ajax.handle_error = function(){
alert(_this.error_msg);
};
}(window.TC = window.TC || {}, jQuery));
// Test it
TC.ajax.run();
需要记住的重要一点是,每次使用function()
,您都在创建一个新的作用域。因此,您可以在TC.ajax.handle\u error
方法中看到,this.error\u msg
未定义,因为您尚未在该范围内定义它。您可以做的一件事是创建原型,确保这些方法与ajax对象相关,并声明该对象的新实例,然后在此基础上调用您的方法。见下文:
(function(TC, $, undefined){
TC.ajax = function() {
this.error_msg = 'default error...';
};
TC.ajax.prototype.run = function(){
//do stuff...
this.handle_error.call(this);
};
TC.ajax.prototype.handle_error = function(){
alert(this.error_msg);
};
}(window.TC = window.TC || {}, jQuery));
// Test it
var ajaxInstance = new TC.ajax();
ajaxInstance.run();
和
您还有其他选择,比如像@kta一样保留一个局部全局变量,或者通过调用函数设置作用域,但这并不真正适用于您的结构。需要记住的重要一点是,每次使用函数()
,您都在创建一个新的作用域。因此,您可以在TC.ajax.handle\u error
方法中看到,this.error\u msg
未定义,因为您尚未在该范围内定义它。您可以做的一件事是创建原型,确保这些方法与ajax对象相关,并声明该对象的新实例,然后在此基础上调用您的方法。见下文:
(function(TC, $, undefined){
TC.ajax = function() {
this.error_msg = 'default error...';
};
TC.ajax.prototype.run = function(){
//do stuff...
this.handle_error.call(this);
};
TC.ajax.prototype.handle_error = function(){
alert(this.error_msg);
};
}(window.TC = window.TC || {}, jQuery));
// Test it
var ajaxInstance = new TC.ajax();
ajaxInstance.run();
和
你也有其他选择,比如像@kta那样保留一个局部全局变量,或者通过调用函数来设置你的作用域,但这并不适用于你的结构。这实际上是一个常见的问题,现在还不清楚这个指的是什么。因此,我想解释一下:
TC.ajax.handle_error = function(){
alert(this.error_msg);
};
TC.ajax.handle\u error
函数中的this
指的是函数,而不是您的TC
对象。
因此,只需将引用保存到TC
,以便您以后可以引用它:
var _this = this;
...
_this.error_msg = 'default error....';
...
TC.ajax.handle_error = function(){
alert(_this.error_msg);
};
这实际上是一个常见的问题,现在还不清楚这个
指的是什么。因此,我想解释一下:
TC.ajax.handle_error = function(){
alert(this.error_msg);
};
TC.ajax.handle\u error
函数中的this
指的是函数,而不是您的TC
对象。
因此,只需将引用保存到TC
,以便您以后可以引用它:
var _this = this;
...
_this.error_msg = 'default error....';
...
TC.ajax.handle_error = function(){
alert(_this.error_msg);
};
如果TC.ajax
应该是一个构造函数,那么需要将run()
和handle\u error()
添加到原型中
但你可以这样做
TC.ajax = {};
TC.ajax.error_msg = 'default error...';
在您的情况下,error\u msg
将在您调用TC.ajax()
时分配给此
,这是永远不会发生的。即使这样,这个
也会指向TC
。当调用TC.ajax.handle\u error()
时,这个指的是TC.ajax
如果TC.ajax
应该是一个构造函数,那么run()
和handle\u error()
需要添加到原型中
但你可以这样做
TC.ajax = {};
TC.ajax.error_msg = 'default error...';
在您的情况下,error\u msg
将在您调用TC.ajax()
时分配给此
,这是永远不会发生的。即使这样,这个
也会指向TC
。当调用TC.ajax.handle\u error()
时,这个
指的是TC.ajax
,这就是我最后使用的:
(function ($, TC, undefined) {
TC.nestedNamespace = TC.nestedNamespace || {};
//add a public function to our new namespace
TC.nestedNamespace.test = function () {
console.log("Winning!");
};
}(jQuery, window.TC = window.TC || {}));
TC.nestedNamespace.test();
例如。我在a的评论中找到了这个方法。这就是我最终使用的方法:
(function ($, TC, undefined) {
TC.nestedNamespace = TC.nestedNamespace || {};
//add a public function to our new namespace
TC.nestedNamespace.test = function () {
console.log("Winning!");
};
}(jQuery, window.TC = window.TC || {}));
TC.nestedNamespace.test();
例如。我在a.Hmmm的评论中找到了这个方法,但我试图引用TC.ajax.error\u msg,而不是TC.error\u msg。这将如何应用于该范围?@Justin抱歉,我将澄清答案,TC
将error\u message
作为属性,因此对TC
的引用允许您访问TC.error\u msg
.Hmmm,但我试图引用的是TC.ajax.error\u msg,而不是TC.error\u msg。这将如何应用于该范围?@Justin抱歉,我将澄清答案,TC
将error\u message
作为属性,因此引用TC
允许您访问TC.error\u msg
。这是可行的,但我试图避免error\u msg
在范围内是全局的(在TC之下)。我希望它只能从TC.ajax和下面嵌套的函数访问。所以当我写this.error\u msg
时,我的意思是TC.ajax.error\u msg
。到目前为止,看起来我需要使用原型,正如埃文所描述的。。。除非你知道另一种方法?这是可行的,但我试图避免error\u msg
在范围内是全局的(在TC下)。我希望它只能从TC.ajax和下面嵌套的函数访问。所以当我写this.error\u msg
时,我的意思是TC.ajax.error\u msg
。到目前为止,看起来我需要使用原型,正如埃文所描述的。。。除非您知道另一种方法,否则这会很好地保持范围,而不像其他解决方案。添加必须创建实例的步骤很糟糕,但我理解为什么需要这样做。很高兴我能提供帮助。如果您计划进入更深入的面向对象JavaScription,那么开始创建实例可能是一个好主意。这与其他解决方案不同,它可以很好地维护范围。添加必须创建实例的步骤很糟糕,但我理解为什么需要这样做。很高兴我能提供帮助。如果您计划使用更深入的面向对象javascript,那么最好开始创建实例