Я пытаюсь «расширить» (не уверен, что является правильным термином для такого рода расширений) элемент DOME до переопределить определенные свойства (базовый элемент). Для этого я динамически создаю функцию, прототип которой является элементом DOME, который я хочу расширить, а затем создаю экземпляр объекта с этой функцией (расширенный элемент).
При назначении значения расширенному элементу ожидаемый результат будет таким: свойство с заданным именем будет создано в расширенном элементе , оставляя базовый элемент без изменений, даже если у него есть свойство с этим то же имя. Выполнение этого с простым объектом в качестве базового элемента работает безупречно, но когда использует DOMElement в качестве базового элемента, базовый элемент изменяется, если существует свойство с тем же именем (в Chrome и Firefox. В IE9 «Недопустимый вызывающий объект» генерируется даже при попытке получить значение свойства).
Тестовый код:
var base = $("<input type='text' />")[0];
//Plain object example: var base = {value:null}
base.value = "original";
var MyClass = function(){ };
MyClass.prototype = base;
var obj = new MyClass();
obj.value = "modified";
obj.value //"modified" (OK)
base.value //"modified" (WRONG!) - "original" if plain object is used (OK)
Применение:
Я намеревался создать расширенный экземпляр элемента ввода с переопределенным атрибутом «значение». Это позволило бы передать этот объект плагину валидатора, который использовал бы переопределенное значение для запуска всех его правил валидации, и в случае любой ошибки исходный объект остался бы неизменным, а расширенный - со всеми изменениями, выполненными валидатором.
Из-за, вероятно, неразрешимого исключения, сгенерированного в IE, мы не собираемся дальше применять этот метод, но я все еще заинтригован этим странным поведением.
В чем может быть проблема:
Я думаю, что это происходит из-за того, что атрибуты и функции DOMElement - это не чистый Javascript, а описание интерфейса реализации браузера. То, что это так, влияет на то, как прототип «наследования» в этом случае работает, делая реализацию собственного метода установки для действия значения вместо создания свойства расширенного объекта. (Это может поддерживаться исключением, генерируемым в IE, утверждающим, что я пытаюсь получить доступ к нативной функции / свойству из неродного элемента).