2015-04-03 4 views
0

я пытаюсь вызвать общественный элемент в функцию, и она выглядит как «не определено», однако функция работает ...Почему «Это» действует в качестве частного члена в функции javascript в этом случае?

- EDIT -
Как отметил @Shane Voisard this действует как член родителя моей функции.

Решение должно дать название функции (как подчеркнул Шейн в ответ).

... или прикрепить функцию к имени:

MySite.Public.Logo = { 

     inject : function(target){ 

      this.name = 'Logo'; 
      ... 
     } 
} 

В консоли:

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

и так далее ... ТНХ SO

-/EDIT -

Моя файловая система следующая

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 был загружен в браузер. Функция работает, я могу получить возврат от logo.js. Но ни один из членов this не публично accessibles ...

Содержание 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: // для тестирования функции I указать цель для конструктора

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" 

ли кто-то имеет ключ, пожалуйста, на то, что я делаю неправильно?

ответ

1

Try:

MySite.Public.Modules.Logo() 
MySite.Public.Modules.name // "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); 

} 

Edit: name property of a function object might be read only, в зависимости от яваскрипта среды. Таким образом, вам может потребоваться использовать другое имя свойства внутри и выставить красивый метод доступа. Например, в инструментах разработчика Chrome я не мог назначить init.name.

MySite - ваш глобальный объект, но вы ссылаетесь на Innov24 как если бы Innov24 = MySite.

Я настоятельно рекомендую Javascript: The Good Parts by Douglas Crockford.

+0

Да, вы правы ... но я не могу понять, почему. Я тебя провожаю по дороге. О инновации24/MySite, действительно MySite === innov24, но я попытался сделать ma question generic. –

+0

У меня есть u_u –