Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Обход Object.defineProperty({configurable: true}) (https://javascript.ru/forum/misc/63224-obkhod-object-defineproperty-%7Bconfigurable-true%7D.html)

SafeSoft 24.05.2016 19:56

Обход Object.defineProperty({configurable: true})
 
У меня такая проблема. Мне нужно изменить свойство объекта защищённого от переопределения функцией 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.

:blink:Как нибудь вообще можно корректно наследовать встроенные объекты JavaScript?


Часовой пояс GMT +3, время: 22:50.