У меня такая проблема. Мне нужно изменить свойство объекта защищённого от переопределения функцией Object.defineProperty({configurable: true}).
Я пытаюсь сделать это через наследование, которого понятно нет в JavaScript. Для этого беру функции которые предложены для таких задач гурами javascript
:
function extend(Child, Parent) {
var F = function() { }
F.prototype = Parent.prototype
Child.prototype = new F()
Child.prototype.constructor = Child
Child.superclass = Parent.prototype
}
// копирует все свойства из src в dst,
// включая те, что в цепочке прототипов src до Object
function mixin(dst, src){
// tobj - вспомогательный объект для фильтрации свойств,
// которые есть у объекта Object и его прототипа
var tobj = {}
for(var x in src){
// копируем в dst свойства src, кроме тех, которые унаследованы от Object
if((typeof tobj[x] == "undefined") || (tobj[x] != src[x])){
try {
dst[x] = src[x];
} catch (e) {
console.error("Error property: " + x);
}
}
}
// В IE пользовательский метод toString отсутствует в for..in
if(document.all && !document.isOpera){
var p = src.toString;
if(typeof p == "function" && p != dst.toString && p != tobj.toString &&
p != "\nfunction toString() {\n [native code]\n}\n"){
dst.toString = src.toString;
}
}
}
Далее мой код вылетающий по ошибке на dispatchEvent:
var myKeyboardEvent = function() {
this.getLastElement = function() {
return this[this.length-1];
}
}
extend(myKeyboardEvent, KeyboardEvent);
//elem может быть любое поле <input type="text" name="elem" id="elem">
function pressKey(elem){
var evt = new myKeyboardEvent("keypress");
mixin(myKeyboardEvent.prototype, new KeyboardEvent("keypress"));
elem.dispatchEvent(evt);
}
Получаю ошибку:
Uncaught TypeError: Failed to execute 'dispatchEvent' on 'EventTarget': parameter 1 is not of type 'Event'.
Мне надо переопределить свойство isTrusted в объекте возвращаемом KeyboardEvent.
Как нибудь вообще можно корректно наследовать встроенные объекты JavaScript?