Pull to refresh

Comments 23

В Javascript и так простое, удобное и функциональное наследование.
Но, похоже, желающие из элегантного функционала сделать электровеник «в стиле языка N» не переведутся никогда.
Согласен, что не нужно переносить модель ООП других языков на довольно красивую идею в JS. Но всё же этот скрипт довольно интересен как эксперимент и понимание работы JS.
если бы этот дсл упрощал работу… а так, поменяли шило на мыло…
В сущности, да — «шило на мыло» — не важно, написать в обертке "_extends" или "<". Здесь лишь можно отметить идейную вариацию с задействованием valueOf. А по поводу упрощенного «DSL» — да, мне больше Coffeescript нравится, хотя я его и не использовал.

P.S.: автору статьи: кстати, идея и изначальная реализация принадлежит Tobias Schneider (и у него заведен репозиторий для этого проекта — github.com/tobeytailor/def.js). И, хоть это и написано в копирайте скрипта, большинство, почему-то, упоминают John Dalton.
Дело в том, что John Dalton переписал полностью gist Tobey, оставив от него только идею. А на github Tobey залил уже модифицированную John'ом версию.
Да, я в курсе, но тем не менее.

оставив от него только идею


«Только идею»? ;) Идея — первична и ядро всех новаторских вещей. Реализация — дело десятое. Удобная реализация — это хорошо.
Прикольно конечно в образовательных целях, но JS сам по себе и без того классная штука.
прожженного рубиста сразу видно по слову «klass»
Просто class — зарезервированное слово, поэтому не только рубисты в реализациях наследования его используют
Осилил. Жесть какая.

Логика немного смахивает на работу обфускаторов. Типа:
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 ({ //…
Вообще, Рубевый «сахар» наследования — это < одна угловая скобка ;)

То же (+ добавлен this.base() через caller): github.com/DmitrySoshnikov/def.js Но, т.к. caller — deprecated и бросает исключение в strict mode, то можно переделать на wrapping функциями.
а что собственно мешает использовать одинарную скобку вместо двойной и в яваскрипте? ;-)
Ничего не мешает, так же valueOf вызовется. В моей версии — одинарная в примере.
у меня тут мысль возникла… а можно ли сделать так, чтобы вызывался valueOf, но возвращался сам объект?

например, +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.

Articles