Это хороший урок в области определения и понимания , когда необходимо определить переменные.
Давайте начнем с самого простого бита:
window.onload = function() {
var ObjectOneInstance = Object.create(ObjectOne);
var ObjectTwoInstance = Object.create(ObjectTwo);
ObjectOneInstance.one_A();
}
В созданных переменных javascriptс var
ограничены функцией включения.Это означает, что ObjectOneInstance
и ObjectTwoInstance
доступны только в функции, которую вы только что создали.За пределами этой функции они не существуют.
Чтобы обойти это, вы можете переместить объявления за пределы функции, где они будут видны всем, но есть одна загвоздка:
/* BUT THIS DOESN'T WORK…FOR A DIFFERENT REASON */
var ObjectOneInstance = Object.create(ObjectOne);
var ObjectTwoInstance = Object.create(ObjectTwo);
window.onload = function() {
ObjectOneInstance.one_A();
}
Теперь ObjectOneInstance
и ObjectTwoInstance
находятся в области видимости, где все могут их видеть, но они зависят от ObjectOne
и ObjectTwo
, которые еще не были определены ... поэтому вы получаете другую ошибку:
TypeError: Прототипом Object может быть только Object или null.
Ключ в том, чтобы получить все в правильной области действия и правильном порядке.Это может быть немного неуловимо с javascript, потому что объекты должны быть определены, когда они оцениваются или вызываются функции, что не обязательно совпадает с моментом загрузки скрипта.Многое в javascript, например, обработчики unload
, происходит асинхронно, что означает, что весь сценарий выполняется, и запускается обработчик , затем , onload
.Это не должно выдавать ошибки:
window.onload = function() {
/* ObjectOneInstance is not defined when the script loads,
but it will be when onload is called */
ObjectOneInstance.one_A();
}
var ObjectOne = {
one_A : function(){
/* It doesn't matter that ObjectTwoInstance is not defined yet;
it will be by the time this function is called */
ObjectTwoInstance.two_A();
}
}
var ObjectTwo = {
two_A : function(){
//do something
}
}
/* Object create is not in an async handler it runs right away,
so ObjectOne and ObjectTwo need to be defined before calling this */
var ObjectOneInstance = Object.create(ObjectOne);
var ObjectTwoInstance = Object.create(ObjectTwo)