JavaScript中嵌套名称空间中的继承

JavaScript中嵌套名称空间中的继承,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(){

我想设置嵌套的名称空间来组织代码。我试图遵循中描述的插件式结构。问题是,在我的示例中,我不理解如何访问这个错误。我的设置正确吗?我必须使用jQuery
.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,那么最好开始创建实例