29.01.2012, 01:50
|
Профессор
|
|
Регистрация: 25.12.2011
Сообщений: 786
|
|
как вариант
(function(name) {
var el = document.createElement("iframe");
document.body.appendChild(el);
window[name] = window.frames[0].Function
})('FunctionX')
FunctionX.prototype.qq = function() {
alert('НЯЯЯ)!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!111')
}
var q = FunctionX('', 'alert("fff")')
q()
|
|
29.01.2012, 02:57
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
Сообщение от Livaanderiamarum
|
как вариант
|
Ну уже хоть что-то.
Хотя, все еще нельзя задать использовать в качестве prototype уже существующий объект.
Но зато это уже независимый от основного окна прототип, который можно использовать для самостоятельного класса функций.
Тот факт, что используется конструктр FUnction(args, code) исправляется оберткой, оборачивающей любую готовую функцию
Интересно, есть ли все-таки способ использовать уже существующий объект?
|
|
29.01.2012, 03:21
|
Профессор
|
|
Регистрация: 25.12.2011
Сообщений: 786
|
|
<body>
<script>
(function(name) {
var el = document.createElement("iframe");
document.body.appendChild(el);
window[name] = function(arg, bod) {
with (window.parent) {
return window.frames[0].Function(arg, bod)
}
}
window[name].prototype = window.frames[0].Function.prototype
})('FunctionX')
FunctionX.prototype.qq = function() {
alert('НЯЯЯ)!!!11')
}
var q = FunctionX('', 'alert("fff")')
var w = Function('', 'alert("fff")')
q()
q.qq()
w()
w.qq()
</script>
</body>
решил проблему с замыканием в области фрейма.
п.с. на сайте метод qq не запускается из-за вложенного фрейма.
к сожалению iFrame удалять нельзя потому что у созданых функций ссылка в __прото__ лежит на прототип в конструкторе айфреймовском.
Последний раз редактировалось Livaanderiamarum, 29.01.2012 в 03:35.
|
|
29.01.2012, 03:31
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
В общем почитал я справочник, и в общем выяснилось, что нельзя для функции использовать свой прототип, на любом уровне наследования
Подробнее:
http://javascript.ru/ecma/part13#a-13.2
Цитата:
|
4. Установить свойство [[Prototype]] объекта F стандартному прототипу объекта Function согласно описанию в разделе 15.3.3.1.
|
http://javascript.ru/ecma/part15#a-15.3.3.1 (Function.prototype)
Цитата:
|
Это свойство обладает атрибутами { DontEnum, DontDelete, ReadOnly }.
|
http://javascript.ru/ecma/part15#a-15.2.3.1 (Object.prototype)
Цитата:
|
Это свойство обладает атрибутами { DontEnum, DontDelete, ReadOnly }.
|
И такой код(не нашел ему подтверждения в справочнике)
alert(Function.prototype.__proto__ == Object.prototype); //true
alert(Object.prototype.__proto__); //null
|
|
29.01.2012, 03:47
|
Профессор
|
|
Регистрация: 25.12.2011
Сообщений: 786
|
|
ну справочник вообще не говорит что оно доступно должно быть [[ ]] же, свойство внутреннее. ну вот, способ вроде рабочий нашли же вроде как))
скрываешь iframe и все))
|
|
29.01.2012, 03:49
|
Профессор
|
|
Регистрация: 25.12.2011
Сообщений: 786
|
|
Скорей бы добавили возможность менять атрибуты свойств, как обещали.
|
|
29.01.2012, 04:00
|
|
Матрос
|
|
Регистрация: 04.04.2008
Сообщений: 6,246
|
|
Сообщение от Livaanderiamarum
|
ну справочник вообще не говорит что оно доступно должно быть [[ ]] же, свойство внутреннее. ну вот, способ вроде рабочий нашли же вроде как))
скрываешь iframe и все))
|
Ты сейчас о чем?
Если о свойстве [[Prototype]], то оно недокументировано доступно как __proto__
В варианте с Iframe это никак не использовалось, так что я не понял какой рабочий способ нашли?
Сообщение от Livaanderiamarum
|
Скорей бы добавили возможность менять атрибуты свойств, как обещали.
|
Представляю какой тогда хаос начнется, если каждый невозбранно будет в системных объектах менять)))
А вот для собственных объектов было бы очень неплохо
Livaanderiamarum,
Спасибо за беседу)
|
|
29.01.2012, 04:36
|
Профессор
|
|
Регистрация: 25.12.2011
Сообщений: 786
|
|
Сообщение от Gvozd
|
Ты сейчас о чем?
|
о том что его вообще вроде как бить не должно)
|
|
29.01.2012, 14:15
|
Особый гость
|
|
Регистрация: 02.04.2010
Сообщений: 4,260
|
|
Livaanderiamarum, мне кажется или так проще?
var FunctionX = Function;
var a = FunctionX('', 'return 1');
FunctionX.prototype.proto1 = function() {
return 2;
};
Function.prototype.proto2 = function() {
return 3;
};
alert([
a(), //1
a.proto1(), //2
a.proto2(), //3
a instanceof FunctionX, //true
a instanceof Function //true
])
PS: не читал весь тред
Последний раз редактировалось monolithed, 29.01.2012 в 14:31.
|
|
29.01.2012, 14:29
|
|
Тлен
|
|
Регистрация: 02.01.2010
Сообщений: 6,589
|
|
Не он хочет так:
// ...
FunctionX.prototype.proto = function() {
alert('proto')
}
Function.prototype.proto2 = function() {
alert('proto2')
}
var a = FunctionX('', 'alert("FunctionX")');
var b = Function('', 'alert("Function")');
a() //FunctionX
a.proto() //proto
a.proto2() //proto2
b() //Function
b.proto() //b.proto is not a function
b.proto2() //proto2
__________________
29375, 35
|
|
|
|