Вызов функции из другого объекта - PullRequest
0 голосов
/ 20 мая 2018

При попытке вызвать функцию, находящуюся в другом объекте, чем тот, из которого я вызываю, я получаю следующую ошибку: «ObjectOneInstance не определен».

Я понимаю, что одним из вариантов является вставкаоператор

ObjectOneInstance.ObjectTwoInstance = ObjectTwoInstance;

(или наоборот) меняет функцию так, чтобы вызывать что-то вроде

this.ObjectTwoInstance.two_A();.

Этот способ работаетприлично, но мне интересно, есть ли другой способ сделать это, который считается лучше или более правильным в области JavaScript, так как последний пример кажется ненормальным и запутанным.

Я пытался сделать свой Javascriptв последнее время они стали более объектно-ориентированными, что, возможно, вызвало некоторое недопонимание того, как выглядит объектно-ориентированный JavaScript, когда приложения становятся более сложными.

window.onload = function() {

    var ObjectOneInstance = Object.create(ObjectOne);
    var ObjectTwoInstance = Object.create(ObjectTwo);
    ObjectOneInstance.one_A();

}

var ObjectOne = {

    one_A : function(){
        ObjectTwoInstance.two_A();
    }
}

var ObjectTwo = {

    two_A : function(){
        //do something

    }
}

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Чтобы попытаться решить возникшую проблему, я переместил экземпляры Object в глобальную область видимости (выше window.onload) и получил сообщение об ошибке Object prototype may only be an Object or null: undefined Основная проблема, с которой я столкнулся;однако, главным образом, было сосредоточено на том, чтобы не объявлять ObjectOne и ObjectTwo перед функцией window.onload.После того как я сделал это и переместил экземпляры в глобальную область, я не получил никаких ошибок.Спасибо @ Nish26 за указание в правильном направлении.

var ObjectOne = {

    one_A : function(){
        ObjectTwoInstance.two_A();

    }
}

var ObjectTwo = {

    two_A : function(){
        //do something
        alert("two_A")

    }
}


var ObjectOneInstance = Object.create(ObjectOne);
var ObjectTwoInstance = Object.create(ObjectTwo);

window.onload = function() {

    ObjectOneInstance.one_A();

} 
0 голосов
/ 20 мая 2018

Это хороший урок в области определения и понимания , когда необходимо определить переменные.

Давайте начнем с самого простого бита:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...