Переопределение собственной функции?

Нативный document.createElement() глупо-глупо (требуется только имя тега и никаких атрибутов). Почему я не могу его переопределить? Почему это не работает?

 var originalFunction = document.createElement; document.createElement = function(tag, attributes) { var element = originalFunction(tag); if (attributes) { for (var attribute in attributes) { element.setAttribute(attribute, attributes[attribute]); } } return element; }; 

Проблема в том, что браузеры взрываются, когда вы пытаетесь заменить нативную функцию. Поскольку document не является примитивом JavaScript, вы также не можете создать прототип для него. WTF.

  • Выполнение кода на уровне страницы из Background.js и возврат значения
  • Удалить элемент по идентификатору
  • Как найти проверенный RadioButton внутри Repeater Item?
  • Обнаружение браузера jQuery?
  • Когда и как вы используете JavaScript на стороне сервера?
  • Установите положение каретки всегда, чтобы закончить в contenteditable div
  • Как получить текст текстового поля ввода во время onKeyPress?
  • Как я могу сгенерировать apk, который может работать без сервера с реагированием?
  • Проверка использования нескольких текстур с кубиками three.js
  • Javascript: установить имя файла для загрузки
  • <Input type = 'file'> IE Предоставляет полный путь, FF дает только имя файла (или просмотр каталога)
  • Почему Date.parse дает неверные результаты?
  • 6 Solutions collect form web for “Переопределение собственной функции?”

    Насколько я могу судить, проблема заключается в том, что вызов функции document.createElement() даже если он ссылается, должен быть из документа. Поэтому измените свой код:

     var element = originalFunction.call(document, tag); 

    FWIW (информационный): вы можете переопределить «родные» методы, в некоторых случаях, и, по крайней мере, в некоторых браузерах. Firefox позволяет мне это сделать:

     document.createElement = function(f) { alert(f); }; 

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

    Философски, вы должны это сделать. Вы можете, скажем, переопределить методы объекта Array и т. Д. Но методы окна (DOM) не покрываются ECMAScript, и поэтому они, вероятно, могут быть зависимыми от реализации. И, конечно же, они так по соображениям безопасности.

    Почему бы просто не использовать метод в вашей собственной функции – напишите его так, как вы хотите, и никогда больше не пишите document.createElement ….

      document.create= function(tag, parent, attributes){ tag= document.createElement(tag); for(var p in attributes){ if(p== 'css') tag.style.cssText= attributes.css; else if(p== 'text') tag.appendChild(document.createTextNode(attributes.text)); else tag[p]= attributes[p]; } if(parent) parent.appendChild(tag); return tag; } document.create('p',document.body,{css:'font-style:italic',className:'important',title:'title', text:'whatever text you like'}); 

    Насколько я знаю, вы не можете переопределить собственные методы из соображений безопасности. Для не-родных методов это не проблема.

    Невозможно переопределить это, но вы можете немного взломать, если не будете бояться передавать не обычные параметры (ы) в нативную функцию. Итак, что-то о createElement, чтобы его роль являлась частью XML DOM, таким образом, вы можете создать любой тэг, который вы хотите. И вот трюк, если вы передадите свои атрибуты в качестве части первого параметра (тэга), разделив их разделителями по вашему выбору, а затем прослушав событие onchange в DOM и если ваши разделители представлены в любом Тег, замените их на правильную разметку, например, с помощью RegExp.

    Шаблон прокси, упомянутый в JavaScript: Overriding alert () должен работать для этого.

    Он упоминается в документах jquery, но не похож, что на самом деле имеет зависимость от jQuery.

    Подробнее здесь: http://docs.jquery.com/Types#Proxy%5FPattern

    JavaScript делает сайт умным, красочным и простым использованием.