Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   во какая хретататень получилась :) (https://javascript.ru/forum/offtopic/25052-vo-kakaya-khretataten-poluchilas.html)

devote 23.01.2012 23:36

во какая хретататень получилась :)
 
Function.prototype.toString = function() {
    return this();
}

var greeting = function() {
    return "hello";
}

alert( greeting + "!" );

ЗЫ. Автор не я! В твитере Ben Alman написал

Gvozd 24.01.2012 02:01

Ичо?

devote 24.01.2012 02:38

Цитата:

Сообщение от Gvozd
Ичо?

Да ничо!

Gvozd 24.01.2012 02:46

Тем не менее.
Что интересного в этом коде, по вашему мнению, что вы его тут опубликовали?
ну, кроме того, что он выдаст ошибку на первой же функции возвращающей объект, например?

FINoM 24.01.2012 05:20

devote, ну вот блин, отобрал у меня 30 минут жизни. Из кодобреда придумал еще вот:
Number.prototype.toString = function(){alert('getter'); return this;}
alert(new Number(1));
Только я вот не понимаю, почему не работает с атомарными типами.
Number.prototype.valueOf = function(){alert('getter'); return this;}
alert(new Number(1) + 3);
Вот еще немножечко бреда.

FINoM 24.01.2012 05:24

Цитата:

Сообщение от Gvozd
ну, кроме того, что он выдаст ошибку на первой же функции возвращающей объект, например?

Это легко проверяется.

monolithed 24.01.2012 08:44

Цитата:

Сообщение от Gvozd
ну, кроме того, что он выдаст ошибку на первой же функции возвращающей объект, например?

так не выдаст, но практического применения нуль:

Function.prototype.toString = function() {
    return this();
}

var greeting = function() {
    return this;
}

alert(greeting.prototype.constructor());

Tim 24.01.2012 08:58

Цитата:

Только я вот не понимаю, почему не работает с атомарными типами.
возможно для них используется функция String() а не метод toString объектов Number и String.

Gvozd 24.01.2012 11:30

Цитата:

Сообщение от FINoM
Это легко проверяется.

вопрос был о том, чем он еще отличается.
то что ошибку выдаст я и так в курсе.

Gozar 24.01.2012 11:44

А ещё можно вот так написать:
Function.prototype.constructor.toString = function() {
    return this();
}

var greeting = function() {
    return "hello";
}

alert( greeting + "!" );


В этом коде тоже много букав ;)

Nekromancer 24.01.2012 15:30

window.onload = function(){
	var iframe = document.createElement('iframe');
	iframe.src = 'javascript: true'; //ie init frame
	document.body.appendChild(iframe);
	iframe.onreadystatechange = function(){
		if(iframe.readyState == 'complete'){
			var F = iframe.contentWindow.Function
			F.prototype.valueOf = function(){
				return this();
			}
			var myObj = {
				one: new F('return 1;')
			}
			alert(myObj.one + 2);
		}
	}
}


Ну вот грубо говоря это нужно для создания геттеров в ИЕ :) Just for fun пойдёт.

trikadin 24.01.2012 15:40

Nekromancer, это круто.

devote 24.01.2012 16:03

Цитата:

Сообщение от Nekromancer
Ну вот грубо говоря это нужно для создания геттеров в ИЕ Just for fun пойдёт.

Ну вот значит все же не зря я запостил эту хретатотень :D

B~Vladi 24.01.2012 17:28

Цитата:

Сообщение от Nekromancer
для создания геттеров в ИЕ

Для этого лучше использовать vbscript. Там же можно создать и сеттеры.

Gozar 24.01.2012 17:30

Цитата:

Сообщение от Fire speed (Сообщение 152546)
дайте знать в двух словах для что и чего prototype

Для ООП.

Nekromancer 24.01.2012 18:13

B~Vladi,
Там вроде как только для объектов созданных из vb классов. Но вообще да. Просто уже к существующему объекту не присвоишь геттер.

FINoM 24.01.2012 18:16

Nekromancer, еще бы сеттеры туда. Я вот недавно долбался с реализацией dataset для IE, но нифига не вышло.

B~Vladi 24.01.2012 18:25

Цитата:

Сообщение от Nekromancer
Просто уже к существующему объекту не присвоишь геттер.

Ну да, не всё так просто.

Nekromancer 24.01.2012 20:41

FINoM,
в ие 8 можно сделать.
B~Vladi,
Ну вот, как альтернатива для самых изощрённых - подход с valueOf пойдёт.

FINoM 24.01.2012 22:44

Цитата:

Сообщение от Nekromancer
в ие 8 можно сделать.

Эм, как?

trikadin 24.01.2012 22:52

Цитата:

Сообщение от FINoM
Эм, как?

elem.attachEvent("onpropertychange", function(){
// код
}).

FINoM 24.01.2012 23:05

Цитата:

Сообщение от trikadin
elem.attachEvent("onpropertychange", function(){
// код
}).

Пробовал, не реагирует на свойства внутри объекта.

trikadin 24.01.2012 23:34

Цитата:

Сообщение от FINoM
Пробовал, не реагирует на свойства внутри объекта.

Работает только для элемента, который побывал в dom'е.

Nekromancer 24.01.2012 23:43

FINoM,
Не работает только для document, window так как их не может быть в документе и им не присваивается behavior. Как только поведение присвоено, можно вешать proeprtychange (Для этого надо либо дождаться readyState == 'complete' при addBehavior('#default') - асинхронное добавление. Либо засунуть элемент в dom, как сказали выше. То есть он должен стать частью дерева. Тогда можно его вытаскивать и крутить как захочешь).
Но в таком случает можно и в ие 7 сделать. Но тут нужны сеттеры, по этому 8ой и defineProperty.

devote 24.01.2012 23:46

Цитата:

Сообщение от Nekromancer
Не работает только для document, window

Хотя у document есть событие onpropertychange и оно срабатывает в тех случаях когда что-то меняет сам браузер... но при создании или изменении значений вручную оно не пашет увы.

Nekromancer 24.01.2012 23:48

devote,
Не, оно вызывается там, да и в window вроде как тоже только для тех свойств, которое присвоил как раз браузер (окружение). Дальше можно поменять onclick - и событие сработает. Вроде так.


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