Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #21 (permalink)  
Старый 29.01.2012, 01:50
Профессор
Посмотреть профиль Найти все сообщения от Livaanderiamarum
 
Регистрация: 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()
Ответить с цитированием
  #22 (permalink)  
Старый 29.01.2012, 02:57
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от Livaanderiamarum
как вариант
Ну уже хоть что-то.
Хотя, все еще нельзя задать использовать в качестве prototype уже существующий объект.

Но зато это уже независимый от основного окна прототип, который можно использовать для самостоятельного класса функций.
Тот факт, что используется конструктр FUnction(args, code) исправляется оберткой, оборачивающей любую готовую функцию

Интересно, есть ли все-таки способ использовать уже существующий объект?
Ответить с цитированием
  #23 (permalink)  
Старый 29.01.2012, 03:21
Профессор
Посмотреть профиль Найти все сообщения от Livaanderiamarum
 
Регистрация: 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.
Ответить с цитированием
  #24 (permalink)  
Старый 29.01.2012, 03:31
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 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
Ответить с цитированием
  #25 (permalink)  
Старый 29.01.2012, 03:47
Профессор
Посмотреть профиль Найти все сообщения от Livaanderiamarum
 
Регистрация: 25.12.2011
Сообщений: 786

ну справочник вообще не говорит что оно доступно должно быть [[ ]] же, свойство внутреннее. ну вот, способ вроде рабочий нашли же вроде как))
скрываешь iframe и все))
Ответить с цитированием
  #26 (permalink)  
Старый 29.01.2012, 03:49
Профессор
Посмотреть профиль Найти все сообщения от Livaanderiamarum
 
Регистрация: 25.12.2011
Сообщений: 786

Скорей бы добавили возможность менять атрибуты свойств, как обещали.
Ответить с цитированием
  #27 (permalink)  
Старый 29.01.2012, 04:00
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от Livaanderiamarum
ну справочник вообще не говорит что оно доступно должно быть [[ ]] же, свойство внутреннее. ну вот, способ вроде рабочий нашли же вроде как))
скрываешь iframe и все))
Ты сейчас о чем?
Если о свойстве [[Prototype]], то оно недокументировано доступно как __proto__
В варианте с Iframe это никак не использовалось, так что я не понял какой рабочий способ нашли?
Сообщение от Livaanderiamarum
Скорей бы добавили возможность менять атрибуты свойств, как обещали.
Представляю какой тогда хаос начнется, если каждый невозбранно будет в системных объектах менять)))
А вот для собственных объектов было бы очень неплохо

Livaanderiamarum,
Спасибо за беседу)
Ответить с цитированием
  #28 (permalink)  
Старый 29.01.2012, 04:36
Профессор
Посмотреть профиль Найти все сообщения от Livaanderiamarum
 
Регистрация: 25.12.2011
Сообщений: 786

Сообщение от Gvozd
Ты сейчас о чем?
о том что его вообще вроде как бить не должно)
Ответить с цитированием
  #29 (permalink)  
Старый 29.01.2012, 14:15
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 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.
Ответить с цитированием
  #30 (permalink)  
Старый 29.01.2012, 14:29
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 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
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передать ссылку на объект а не объект возникновения события Blazze Events/DOM/Window 0 11.10.2011 00:45
jQuery - объект или функция? jazzz13 jQuery 8 16.08.2011 04:01
функция должна возвращать объект без одного свойства blackzub Общие вопросы Javascript 4 14.12.2009 19:25
Модуль для работы с модулями JSprog Ваши сайты и скрипты 29 02.09.2009 13:31
Получить объект содержащий caller no_alex Общие вопросы Javascript 14 20.03.2009 21:37