powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Расширить базовые обьекты безопасным способом, без прототипов (для TypeScript тоже)
10 сообщений из 10, страница 1 из 1
Расширить базовые обьекты безопасным способом, без прототипов (для TypeScript тоже)
    #39775289
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
https://stackoverflow.com/questions/54738181/extend-typescript-javascript-native-objects-in-a-safe-way-with-sweet-js-hygien

Магия, расширить базовые обьекты безопасным способом, без загрязнения прототипов

Есть штука https://www.sweetjs.org позволяющая трансформировать JS код. Похоже с ней должно получится расширить базовые обьекты Array, Object, String безопасным способом, без загрязнения прототипов. Все будет выглядеть так словно ты добавил методы к прототипам, но на самом деле они будут чистыми.

Например, можно будет писать вот такой код, на первый взгляд кажется что мы раширили прототип обьекта

Код: javascript
1.
    { a: 1 }.isEmpty()



Но в реальности, после процессинга https://www.sweetjs.org он будет преобразован в следующее

Код: javascript
1.
    Extensions.isEmpty({ a: 1 })



Где екстеншен реализован как

Код: javascript
1.
2.
3.
4.
5.
    Extensions.isEmpty = (o) => {
      if ('isEmpty' in o) return o.isEmpty()
      for (const k in o) if (o.hasOwnProperty(k)) return false
      return true
    }



Единственная проблема - я не понял как написать такой макрос, никто не знает https://www.sweetjs.org ?

Если у кого есть аккаунт на стековерфлоу, плюсаните там плиз, может там кто ответит https://stackoverflow.com/questions/54738181/extend-typescript-javascript-native-objects-in-a-safe-way-with-sweet-js-hygien

P.S.

А с тайпскриптом будет еще круче. Мы обманим его ложной декларацией - и получим все правильные подсказки и валидации в редакторе, а затем после копмиляции тайпскрипта прогоним еще через свитжс.

Код: javascript
1.
2.
3.
4.
5.
    declare global {
      interface Object {
        isEmpty(): boolean
      }
    }
...
Рейтинг: 0 / 0
Расширить базовые обьекты безопасным способом, без прототипов (для TypeScript тоже)
    #39775290
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
private,

TypeScript-жешь.

Код: javascript
1.
2.
3.
4.
syntax hi = function (ctx) {
  return #`console.log('hello, world!')`;
}
hi



юзать такое -- смерти подобно.
...
Рейтинг: 0 / 0
Расширить базовые обьекты безопасным способом, без прототипов (для TypeScript тоже)
    #39775344
Лысый дядька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
private,

Никому бы не рекомендовал использовать этот или похожий инструмент в работе.
Вы вводите лишние сущности без необходимости. Нет никакой проблемы определить функцию isEmpty в любом удобном для вас месте программы. Почему это должен быть именно метод базового класса? Какая необходимость применять хитрые хаки и даже препроцессинг(!) чтобы вместо isEmpty(o) получить o.isEmpty()? Не говоря о том, что вы усложняете разработку и деплой вводя еще один этап в сборку проекта без существенных на то причин, вы совершенно сознательно делаете явное неявным. Понятно, когда базовые классы редактируют по требованиям совместимости с помощью полифилов, во-первых на это есть серьезные причины, а во вторых вводятся не неизвестно какие нововведения, а методы новых стандартов . Вы же по сути предлагаете корёжить язык просто так, потому что "а почему бы и нет", тем самым нарушая одну из основных заповедей ООП "Открыт для расширения, закрыт для изменения".
...
Рейтинг: 0 / 0
Расширить базовые обьекты безопасным способом, без прототипов (для TypeScript тоже)
    #39775801
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лысый дядька,

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

https://en.wikipedia.org/wiki/Trait_(computer_programming)

другое дело, что изгаляться над JS это кощунство.
хочешь методы расширения (и многое-многое другое) для JS, бери TypeScript.

не нужно вот этого вот sweetjs.org -- это не свит, это bullshitjs
...
Рейтинг: 0 / 0
Расширить базовые обьекты безопасным способом, без прототипов (для TypeScript тоже)
    #39775819
Лысый дядька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttна самом деле, это отличный инструмент, который используется во многих языках
Не-не-не, это совсем о другом. То что делает топикстартер к типажам или методам расширения отношения не имеет. Эта практика называется манки-патчинг, какие тут типажи, о чем вы? Он глобально изменяет некий класс, который даже понятия не имеет о том, что его изменили, и это может иметь побочки в любом случайном месте программы во всех наследниках. Это как если бы я в питоне сделал вот эдак
Код: python
1.
2.
3.
import datetime
_now = datetime.datetime.now
datetime.datetime.now = lambda : _now() - datetime.timedelta(hours=1)


и предлагаю это подебажить :)
...
Рейтинг: 0 / 0
Расширить базовые обьекты безопасным способом, без прототипов (для TypeScript тоже)
    #39775833
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лысый дядька,

дык он и хочет "магии", чтобы выглядело как метод расширения, а работало как вызов метода из другого класса, только это всё должно быть на уровне языка, а не мутации.

поэтому TS
...
Рейтинг: 0 / 0
Расширить базовые обьекты безопасным способом, без прототипов (для TypeScript тоже)
    #39775973
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ох уж эти mixin с соответствующим мышлением людей, его использующих :))

не предусмотрел метод или атрибут на этапе проектирования? - не беда... в рантайме добавим где надо :)) Прям верх инженерной мысли.
Не спорю, примеси могут быть полезными, но только когда хорошо документированы и цепляются к объектам (классам) семантически цельными блоками в конкретно отведённых для того местах (как, например, поведения в yii и им подобные в других фреймворках на пыхе, позволяющие легко реализовать механизм плагинов), но не то, что обычно приходится лицезреть на js, когда в наглую посреди работы программы какой-то из объектов просто начинает структурно изменяться другим объектом.
...
Рейтинг: 0 / 0
Расширить базовые обьекты безопасным способом, без прототипов (для TypeScript тоже)
    #39776482
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёркогда в наглую посреди работы программы какой-то из объектов просто начинает структурно изменяться другим объектом

Так как это прямая возможность языка, приходится огораживаться соглашениями и стайлгайдами. Сам язык никоим образом не припятствует этому нигде :)
...
Рейтинг: 0 / 0
Расширить базовые обьекты безопасным способом, без прототипов (для TypeScript тоже)
    #39782016
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторТо что делает топикстартер к типажам или методам расширения отношения не имеет. Эта практика называется манки-патчинг

Топикстартер говорит об абсолютно безопасном способ расширения, см. C# / Kotlin Extension Methods другое дело что в жаваскрипте этого нету.

Про ТайпСкрипт - да, клевая штука я уже давно перешел на него, но в нем тоже таких расширений нету.
...
Рейтинг: 0 / 0
Расширить базовые обьекты безопасным способом, без прототипов (для TypeScript тоже)
    #39782023
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторхочешь методы расширения (и многое-многое другое) для JS, бери TypeScript.
Их нету в тайпскрипте тоже.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Расширить базовые обьекты безопасным способом, без прототипов (для TypeScript тоже)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]