为什么在这种情况下,“This”确实充当javascript函数中的私有成员

Why "This" does act as a private member in a javascript function in this case?

本文关键字:函数 javascript 成员 这种情况下 This 为什么      更新时间:2023-09-26

我尝试在函数中调用公共成员,它显示为"未定义",但该函数有效...

--编辑--
正如@Shane Voisard所指出的,this是我的职能的父级成员。

解决方案是为函数命名(如 Shane 在答案中强调的那样(。

。或者将函数附加到名称:

MySite.Public.Logo = { 
        inject : function(target){
             this.name = 'Logo';
             ...
        }
}

在控制台中:

MySite.Public.Modules.Logo.name; //return "Logo" 

等等...谢谢 所以

--/编辑--

我的文件系统是这样的

root folder :
-rw-r--r--  1 www-data www-data 1921 avril  3 17:31 0.js
drwxr-xr-x  9 www-data www-data 4096 avril  3 17:37 public
public folder :
-rw-r--r-- 1 www-data www-data  214 avril  3 17:37 0.js
drwxr-xr-x 2 www-data www-data 4096 avril  3 17:40 modules
drwxr-xr-x 2 www-data www-data 4096 avril  3 17:40 factories
drwxr-xr-x 2 www-data www-data 4096 avril  3 17:40 functions
drwxr-xr-x 2 www-data www-data 4096 avril  2 22:22 singleton
module folder : 
-rw-r--r-- 1 www-data www-data  28 mars  31 06:07 1.js
-rw-r--r-- 1 www-data www-data 348 avril  3 17:51 logo.js

加载按以下顺序进行:
root/0.js初始化MySite = {}
public/0.js初始化MySite.Public = {}
module/1.js初始化MySite.Public.Modules = {}

加载所有其他需要的文件时,public/0.js调用 MySite.Public.Modules.Logo() ,当logo.js加载到浏览器中时已初始化。该功能有效,我可以从徽标.js获得回报。但是this成员中没有一个是公开访问的......

logo.js内容 :

MySite.Public.Modules.Logo = function(){
        this.name = 'Logo';
        this.build = function(){
                var logo = MySite.Public.Factories.HTML.make('logo');
                return logo;
        };  
        this.inject = function(target){
                var logo = this.build();
                var target = MySite.Public.Functions.ToolBox.getElementByName(target); //getElementByName is a custom function
                target.appendChild(logo);
        }; 
}

在控制台中:

MySite.Public.Modules.Logo.inject('body'); // undefined is not a function...
MySite.Public.Modules.Logo.build(); // undefined is not a function...
MySite.Public.Modules.Logo.name; // ""
typeof MySite.Public.Modules.Logo; // "function"

logo.js的内容 ://测试函数我给构造函数的目标

MySite.Public.Modules.Logo = function(target){
        this.name = 'Logo';
        this.build = function(){
                var logo = MySite.Public.Factories.HTML.make('logo');
                return logo;
        };  
        this.inject = function(target){
                var logo = this.build();
                var target = MySite.Public.Functions.ToolBox.getElementByName(target);
                target.appendChild(logo);
        };  
        this.inject(target);
}

在控制台中:

MySite.Public.Modules.Logo('body'); //works

不过...

MySite.Public.Modules.Logo.inject('body'); // undefined is not a function...
MySite.Public.Modules.Logo.build(); // undefined is not a function...
MySite.Public.Modules.Logo.name; // ""
typeof MySite.Public.Modules.Logo; // "function"

请问有人知道我做错了什么吗?

尝试:

MySite.Public.Modules.Logo()
MySite.Public.Modules.name // "Logo"

调用 Logo(( 时,this.name 指的是MySite.Public.Modules对象。 在对象方法上下文中调用函数时,javascript 会在运行时将对象隐式分配给调用函数内部this

如果要在函数对象上定义方法,请为函数命名,然后在函数中引用该名称:

MySite.Public.Modules.Logo = function init(target){
        init.l_name = 'Logo';
        init.getName = function { return l_name };
        init.build = function(){
                var logo = MySite.Public.Factories.HTML.make('logo');
                return logo;
        };  
        init.inject = function(target){
                var logo = init.build();
                var target = MySite.Public.Functions.ToolBox.getElementByName(target);
                target.appendChild(logo);
        };  
        init.inject(target);
}

编辑:函数对象的name属性可能是只读的,具体取决于javascript环境。 因此,您可能需要在内部使用不同的属性名称并公开一个漂亮的访问器方法。 例如,在Chrome开发人员工具中,我无法分配给init.name

MySite是您的全局对象,但您引用Innov24好像Innov24 = MySite .

我强烈推荐 Douglas Crockford 的 Javascript: The Good Parts。