Почему не делает function.apply (), работают через границы документа в IE?

Отражение имени используется для описания кода, который в состоянии осмотреть другой код в той же системе (или оно).

, Например, скажите, что у Вас есть объект неизвестного типа в Java, и требуется назвать 'doSomething' метод на нем, если Вы существуете. Система статического контроля типов Java действительно не разработана для поддержки этого, если объект не соответствует известному интерфейсу, но отражение использования, код может посмотреть на объект и узнать, имеет ли это метод, названный 'doSomething', и затем назовите его, если Вы хотите.

Так, чтобы дать Вам пример кода этого в Java (воображают рассматриваемый объект, является нечто):

Method method = foo.getClass().getMethod("doSomething", null);
method.invoke(foo, null);

Один случай очень общего использования в Java является использованием с аннотациями. JUnit 4, например, будет использовать отражение для просмотра классов для методов, отмеченных с @Test аннотацией, и тогда назовет их при выполнении модульного теста.

существуют некоторые хорошие отражательные примеры для запущения Вас в http://docs.oracle.com/javase/tutorial/reflect/index.html

И наконец, да, понятия в значительной степени подобны в другом статически языки типов, которые поддерживают отражение (как C#). На динамически типизированных языках вариант использования, описанный выше, менее необходим (так как компилятор позволит любому методу быть названным на любом объекте, переставшем работать во времени выполнения, если это не будет существовать), но второй случай поиска методов, которые отмечены или работают определенным способом, все еще распространено.

Обновление из комментария:

способность осмотреть код в системе и видеть типы объектов не является отражением, а скорее Самоанализом Типа. Отражение является тогда способностью сделать модификации во времени выполнения путем использования самоанализа. Различие необходимо здесь, поскольку некоторые языки поддерживают самоанализ, но не поддерживают отражение. Одним таким примером является C++

5
задан Herms 9 July 2009 в 14:33
поделиться

4 ответа

Вам необходимо создать массивы в другом окне, потому что каждое окно имеет свой собственный конструктор массива. Думаю, это сработает.

Добавьте эту функцию в test2.html:

function getEmptyArray() {
    return new Array();
}

И эту функцию в test1.html:

Array.prototype.cloneToRemote = function (win) {
    var newArray = win.getEmptyArray();
    for (var i = 0; i < this.length; i++)
    {
        newArray.push(this[i]);
    }
    return newArray;
}

Затем сделайте следующее:

function applyArgs() {
    opened.testFunc.apply(opened, ["applied array"].cloneToRemote(opened));
}

Обратите внимание, похоже, вы должны уметь делать

var newArray = new win.Array();

в функции test1.html cloneToRemote (), но я не смог заставить это работать. Если бы вы могли это сделать, вы могли бы избавиться от новой функции getEmptyArray () в test2.html.

6
ответ дан 14 December 2019 в 13:44
поделиться

Если вы измените функцию test2.html testApply () следующим образом:

function testApply() {
    testFunc.apply(this, arguments);
}

remoteApply () работает. Но applyArgs () все равно не удалось.

0
ответ дан 14 December 2019 в 13:44
поделиться

Понятия не имею, почему это работает, но я поигрался с вашим кодом и наткнулся на одно решение ... поместите функции test2 внутрь test1, и он работает:

<HTML>
<HEAD>
<script language="javascript" type="text/javascript">
  var opened = null;

  function applyArgs() {
    testFunc.apply(opened, ["applied array"]);
  }

  function openPopup() {
    opened = window.open("test2.html", "_blank");
  }

  function testFunc() {
    var s = "Got: ";
    for(var i = 0; i < arguments.length; i++) {
      s += arguments[i] + " ";
    }
    this.document.getElementById("output").innerHTML += s + "<BR>";
  }
</script>
</HEAD>
<BODY>
  <a href="#" onclick="openPopup()">OPEN</a>
  <hr>
  <a href="#" onclick="applyArgs()">applyArgs</a>
</BODY>
</HTML>

Я дайте вам знать, смогу ли я выяснить еще (IE такой странный). Как я уже сказал, я просто играл с кодом.

0
ответ дан 14 December 2019 в 13:44
поделиться

"... applyArgs () выдает ошибку «Ожидается объект JScript» при попытке вызвать apply (test1.html, строка 11). remoteApply () выдает ту же ошибку «Ожидается объект JScript» при попытке вызвать apply (test2.html, строка 5). ... "

Какой именно объект не является« объектом JScript », как« ожидалось »?

(подсказка: используйте отладчик)

- DBJ

0
ответ дан 14 December 2019 в 13:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: