Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Объект-функция с заданным прототипом (https://javascript.ru/forum/misc/25203-obekt-funkciya-s-zadannym-prototipom.html)

Livaanderiamarum 29.01.2012 01:50

как вариант

(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()

Gvozd 29.01.2012 02:57

Цитата:

Сообщение от Livaanderiamarum
как вариант

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

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

Интересно, есть ли все-таки способ использовать уже существующий объект?

Livaanderiamarum 29.01.2012 03:21

<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 удалять нельзя потому что у созданых функций ссылка в __прото__ лежит на прототип в конструкторе айфреймовском.

Gvozd 29.01.2012 03:31

В общем почитал я справочник, и в общем выяснилось, что нельзя для функции использовать свой прототип, на любом уровне наследования


Подробнее:
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

Livaanderiamarum 29.01.2012 03:47

ну справочник вообще не говорит что оно доступно должно быть [[ ]] же, свойство внутреннее. ну вот, способ вроде рабочий нашли же вроде как))
скрываешь iframe и все))

Livaanderiamarum 29.01.2012 03:49

Скорей бы добавили возможность менять атрибуты свойств, как обещали.

Gvozd 29.01.2012 04:00

Цитата:

Сообщение от Livaanderiamarum
ну справочник вообще не говорит что оно доступно должно быть [[ ]] же, свойство внутреннее. ну вот, способ вроде рабочий нашли же вроде как))
скрываешь iframe и все))

Ты сейчас о чем?
Если о свойстве [[Prototype]], то оно недокументировано доступно как __proto__
В варианте с Iframe это никак не использовалось, так что я не понял какой рабочий способ нашли?
Цитата:

Сообщение от Livaanderiamarum
Скорей бы добавили возможность менять атрибуты свойств, как обещали.

Представляю какой тогда хаос начнется, если каждый невозбранно будет в системных объектах менять)))
А вот для собственных объектов было бы очень неплохо

Livaanderiamarum,
Спасибо за беседу)

Livaanderiamarum 29.01.2012 04:36

Цитата:

Сообщение от Gvozd
Ты сейчас о чем?

о том что его вообще вроде как бить не должно)

monolithed 29.01.2012 14:15

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: не читал весь тред

Aetae 29.01.2012 14:29

Не он хочет так:
// ...

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


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