2016-10-30 5 views
1

Я JS файл myScript.jsдоступа метод объекта в JavaScript

(function() {  
    'use strict';  
    if (!window.myObj) { 
     window.myObj= {}; 
    }  
    var myObj= window.myObj; 
    myObj = { 
     home: function() { 
      console.log('hi from home'); 
     }, 
     details: function(){ 
      console.log('hi from details'); 
     }  
})(); 

вид внутри страницы Я пытаюсь получить доступ к методу домой на объекте myObj

<script> 
     $(document).ready(function() { 
      myObj.home(); 
     }); 
</script> 

, но я получаю

uncaught TypeError: myObj.home is not a function(…)

Загружается myScript.js и не содержит ошибок при загрузке страницы.

+0

Ваш код выглядит неполным. 'myObj' не закрыт ... – evolutionxbox

ответ

3

Вы можете напрямую присвоить свойства myObj без перезаписи переменной и сохранения window.myObj.

Перед назначением

    +----------------+ 
window.myObj -----> |    | 
        | { }   | 
myObj ------------> |    | 
        +----------------+ 

после присвоения

    +----------------+ 
window.myObj -----> | { }   | 
        +----------------+ 

        +----------------+ 
myObj ------------> | {    | 
        | home: fn .., | 
        | details: fn ..| 
        | }    | 
        +----------------+ 

(function() {  
 
    'use strict';  
 
    if (!window.myObj) { 
 
     window.myObj = {}; 
 
    }  
 
    var myObj = window.myObj; 
 
    myObj.home = function() { 
 
     console.log('hi from home'); 
 
    }; 
 
    myObj.details = function(){ 
 
     console.log('hi from details'); 
 
    }; 
 
})(); 
 

 
myObj.home(); 
 
myObj.details();

Или использовать Object.assign в ES6

(function() {  
 
    'use strict';  
 
    if (!window.myObj) { 
 
     window.myObj = {}; 
 
    }  
 
    var myObj = window.myObj; 
 
    Object.assign(myObj, { 
 
     home: function() { 
 
      console.log('hi from home'); 
 
     }, 
 
     details: function(){ 
 
      console.log('hi from details'); 
 
     } 
 
    }); 
 
})(); 
 

 
myObj.home(); 
 
myObj.details();

0

Вам нужно сделать myObj глобальной

var myObj = undefined; 
 
(function() { 
 
    'use strict'; 
 
    if (!window.myObj) { 
 
    window.myObj = {}; 
 
    } 
 
    myObj = window.myObj; 
 
    myObj = { 
 
    home: function() { 
 
     console.log('hi from home'); 
 
     return true 
 
    }, 
 
    details: function() { 
 
     console.log('hi from details'); 
 
     return true 
 
    } 
 
    } 
 
})(); 
 

 
console.log(myObj.home())

0

У вас не хватает) paranthesis, а также сделать объект глобального,

var myObj; 
    (function() { 
    'use strict'; 

    if (!window.myObj) { 
     window.myObj = {}; 
    } 
    myObj = window.myObj; 
    myObj = { 
     home: function() { 
     console.log('hi from home'); 
     }, 
     details: function() { 
     console.log('hi from details'); 
     } 
    } 
    })(); 
    $(document).ready(function() { 
    myObj.home(); 
    }) 

DEMO

1

Вы можете установить переменную myObj в вашем примере в качестве ссылки на переменную window.myObj, а затем вы переопределить это ссылочный с новым объектом. Исходная переменная window.myObj по-прежнему является переменной, которую вы установили (в window.myObj= {};);

Проверить этот пример:

(function() { 
 
    if (!window.myObj) { 
 
    window.myObj= { home: function() { console.log('original home'); } }; 
 
    } 
 
    var myObj = window.myObj; 
 
    myObj = { 
 
    home: function() { 
 
     console.log('hi from home'); 
 
    }, 
 
    details: function(){ 
 
     console.log('hi from details'); 
 
    }  
 
    } 
 
})(); 
 
$(document).ready(function() { 
 
    window.myObj.home(); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

Вы можете использовать window.myObj = {...} или вы можете установить определенную функцию этой переменной (используя myObj.home = function() { ... }).

0

Это здесь, кажется, ваш вопрос ...

var myObj= window.myObj; 

Поскольку выше строка кода была помещена внутри анонимной функции, только код в пределах этой функции можно получить доступ к нему.

Один из способов исправить вашу проблему - сделать myObj общедоступной переменной.

Перед вашей анонимной функции, поместите следующий код ...

var myObj = {}; 

Потому что это вне анонимной функции, myObj объявляется в глобальном масштабе и, следовательно, могут быть доступны из вашей функции.

Из-за этой регулировки, мы можем избавиться от большого блока кода ...

if (!window.myObj) { 
    window.myObj= {}; 
}  
var myObj= window.myObj; 

Вот окончательный код, который делает то, что вы ищете ...

var myObj = {}; // declare myObj in a global scope 
(function() {  
    'use strict'; 
    myObj = { // since myObj is already declared as global, our function can access it 
     home: function() { 
      console.log('hi from home'); 
     }, 
     details: function(){ 
      console.log('hi from details'); 
     }  
    } 
})(); 
myObj.home(); //testing out our code 
myObj.details(); 

Вот рабочий пример ... http://labs.codecademy.com/D395#:workspace

0

вы можете получить доступ к вашей собственности окна с помощью этого:

enter image description here

(function() {  
 
    'use strict';  
 
    if (!window.myObj) { 
 
     window.myObj = {}; 
 
    }  
 
    var myObj = window.myObj; 
 
    myObj.home = function() { 
 
      console.log('hi from home'); 
 
    }; 
 
    myObj.details = function(){ 
 
     console.log('hi from details'); 
 
    }; 
 
})();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script> 
 
     $(function(){ 
 
     window.myObj.home(); 
 
     window.myObj.details(); 
 
     }); 
 
    </script>

Смежные вопросы