Comments 23
В Javascript и так простое, удобное и функциональное наследование.
Но, похоже, желающие из элегантного функционала сделать электровеник «в стиле языка N» не переведутся никогда.
Но, похоже, желающие из элегантного функционала сделать электровеник «в стиле языка N» не переведутся никогда.
магия :)
если бы этот дсл упрощал работу… а так, поменяли шило на мыло…
В сущности, да — «шило на мыло» — не важно, написать в обертке "_extends" или "<". Здесь лишь можно отметить идейную вариацию с задействованием valueOf. А по поводу упрощенного «DSL» — да, мне больше Coffeescript нравится, хотя я его и не использовал.
P.S.: автору статьи: кстати, идея и изначальная реализация принадлежит Tobias Schneider (и у него заведен репозиторий для этого проекта — github.com/tobeytailor/def.js). И, хоть это и написано в копирайте скрипта, большинство, почему-то, упоминают John Dalton.
P.S.: автору статьи: кстати, идея и изначальная реализация принадлежит Tobias Schneider (и у него заведен репозиторий для этого проекта — github.com/tobeytailor/def.js). И, хоть это и написано в копирайте скрипта, большинство, почему-то, упоминают John Dalton.
Дело в том, что John Dalton переписал полностью gist Tobey, оставив от него только идею. А на github Tobey залил уже модифицированную John'ом версию.
Прикольно конечно в образовательных целях, но JS сам по себе и без того классная штука.
прожженного рубиста сразу видно по слову «klass»
Осилил. Жесть какая.
Логика немного смахивает на работу обфускаторов. Типа:
javascript:alert(({a:1,b:2,toString:function(){return 'Привет, '}}) + [«запутывать!»,«любитель „].reverse().join(''))
Я про подмену стандартного метода valueOf и тайного знания о том, как он дружит с операцией сдвига “<<» + транспорт через deferred. Браво!
Это меня вначале зацепило — «Как же им удалось переопределить оператор << ?» — подумал я. Оказалось — никак :)
Логика красива, синтакс красив, применение — ну не знаю, не уверен, что кому-то понадобится.
Логика немного смахивает на работу обфускаторов. Типа:
javascript:alert(({a:1,b:2,toString:function(){return 'Привет, '}}) + [«запутывать!»,«любитель „].reverse().join(''))
Я про подмену стандартного метода valueOf и тайного знания о том, как он дружит с операцией сдвига “<<» + транспорт через deferred. Браво!
Это меня вначале зацепило — «Как же им удалось переопределить оператор << ?» — подумал я. Оказалось — никак :)
Логика красива, синтакс красив, применение — ну не знаю, не уверен, что кому-то понадобится.
Кстати, мысля в том же русле, можно вместо '<<' заюзать, скажем, '+':
// line 60: deferred.valueOf = function() {
// replace with:
deferred.toString = function() {
…
// line 79: return Klass.addPlugins(deferred._plugins);
// replace with:
return Klass.addPlugins(deferred._plugins) && 'yes, i am ';
…
// И теперь вместо def('a') << b() пишем def('a') + b()
def ('Ninja') + Person ({ //…
// line 60: deferred.valueOf = function() {
// replace with:
deferred.toString = function() {
…
// line 79: return Klass.addPlugins(deferred._plugins);
// replace with:
return Klass.addPlugins(deferred._plugins) && 'yes, i am ';
…
// И теперь вместо def('a') << b() пишем def('a') + b()
def ('Ninja') + Person ({ //…
Вообще, Рубевый «сахар» наследования — это < одна угловая скобка ;)
То же (+ добавлен this.base() через caller): github.com/DmitrySoshnikov/def.js Но, т.к. caller — deprecated и бросает исключение в strict mode, то можно переделать на wrapping функциями.
То же (+ добавлен this.base() через caller): github.com/DmitrySoshnikov/def.js Но, т.к. caller — deprecated и бросает исключение в strict mode, то можно переделать на wrapping функциями.
а что собственно мешает использовать одинарную скобку вместо двойной и в яваскрипте? ;-)
Ничего не мешает, так же valueOf вызовется. В моей версии — одинарная в примере.
у меня тут мысль возникла… а можно ли сделать так, чтобы вызывался valueOf, но возвращался сам объект?
например, +XXX вернёт число, а хотелось бы, чтобы вернуло само XXX
например, +XXX вернёт число, а хотелось бы, чтобы вернуло само XXX
кроме очевидного XXX() разумеется
Нет, нельзя. valueOf должен вернуть primitive value, а это строка или число
например, +XXX вернёт число
В общем случае, это ToNumber (вызывается плюсом) вернёт число; valueOf может вернуть объект (так, например, возвращает стандартный Object.prototype.valueOf — результатом будет this-value).
var o = {}; o.valueOf() === o; // true
Ты можешь переопределить valueOf любого объекта и вернуть всё, что надо. Только если оба — и toString, и valueOf будут возвращать не примитив, а объект, тогда может быть TypeError в некоторых операциях (например, в конвертации ToNumber). При этом, они (до ошибки) всё равно будут вызываться.
function foo() {} //console.log(foo.valueOf() === foo); // true foo.valueOf = function () { console.log("foo.valueOf is called"); return {}; }; foo.toString = function () { console.log("foo.toString is called"); return {}; }; +foo; --> "foo.valueOf is called" "foo.toString is called" TypeError "can't convert foo to number"
Вызывать их вручную — ничего не мешает и ты можешь возвращать объекты (но вызывать их вручную — это вряд ли подойдёт для «сахара», который ты задумал).
foo.valueOf(); // OK, объект foo.toString(); // OK, объект
Хотя, Chrome выпендривается с одной <. Вернул <<.
Sign up to leave a comment.
Простое наследование в стиле Ruby для Javascript