Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Виртуальный класс а-ля Си Плас Плас (https://javascript.ru/forum/misc/51128-virtualnyjj-klass-lya-si-plas-plas.html)

terminator-101 26.10.2014 00:12

Voronar,
Вообще, ящетаю, "Безопасное" расширение нативных объектов, могло бы выглядеть вот так
Object.prototype._=function(f){return f(this)}

show=function(x){console.log(x)}
sum=function(x){console.log(x+x)}

;({a: 1})._(show) // { a: 1 }
;1.._(sum) // 2

Расширяем одной функцией, а затем через каллбэк дергаем как хочем. Одну ф-цию задокументировать и запомнить -- не проблема. И не надо никаких сраных костылей enumerable и пр.

Aetae 26.10.2014 00:13

Цитата:

Сообщение от terminator-101 (Сообщение 337600)
но проблема высосана из пальца.

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

Voronar, слушать terminator-101 и kostyanet(скорее всего это вообще одно лицо) следует с осторожностью.(обрати внимание на карму) Они живут в своём маленьком трололо мире, слабо связанном с действительностью. Иногда чего дельного и могут сказать в моменты просветления, но в целом..

Erolast 26.10.2014 06:53

Цитата:

Кстати, а нельзя вместо объекта во 2-ом аргументе create, просто написать вот так:
Child.prototype.constructor = Child;
Нет. Конструктор не должен быть enumerable (поломает код с for in).

Цитата:

Я говорю. Это унылый быдлокод, который плодит лишние объекты в цепочки прототипов.
Справедливо, если тебе не требуются собственные методы в наследующем классе (а ТС требуется). Специально для этого в ES6 предусмотрен такой синтаксис:
class Parent {
  someMethod();
}
class Child prototype Parent.prototype {};

console.log((new Child).__proto__ == Parent.prototype); //true

Erolast 26.10.2014 09:51

Цитата:

Сообщение от Aetae (Сообщение 337597)
Надо примерно так:
Object.defineProperty(Object.prototype, 'extends', {
  value: function(){},
  enumerable: *!*false*/!*,
  writable: true,
  configurable: true
});

И не в прототип объекта, а в прототип функции.

terminator-101 26.10.2014 10:20

Цитата:

Сообщение от Erolast
а в прототип функции

А Object -- это что не функция? Или ты имеешь в виду Object.__proto__?
По-идее, то что он написал, это тоже самое, что ({}).__proto__. Вроде, именно так и расширяются нативные объекты. А в саму то функцию что толку писать?
alert(Object.prototype===({}.__proto__)) // true

terminator-101 26.10.2014 10:30

Erolast,
Object.__proto__.one=1
Object.prototype.ten=10
alert([{}.one, {}.ten])

Erolast 26.10.2014 14:26

Цитата:

А Object -- это что не функция?
В прототип класса функции - так яснее?
Object.defineProperty(Function.prototype, "extends", {
  writable: true,
  configurable: true,
  enumerable: false,
  value: function(){}
});

Цитата:

Object.__proto__.one=1
Object.prototype.ten=10
alert([{}.one, {}.ten])
Да ну?

terminator-101 26.10.2014 15:04

Цитата:

Сообщение от Erolast (Сообщение 337650)
В прототип класса функции - так яснее?

То что ты написал, эквивалентно
Function.prototype.extends=function(){}
console.log(function(){}.extends, ({}).extends, "foo".extends)
// [Function] undefined undefined

за исключением сраного enumerable
Ты расширил функцию, а речь шла за объекты.

Цитата:

Да ну?
Что ну? Ликбез тебе провести? Я смотрю, ты ваще конкретно плаваешь в сабже. Пытаешься спрятать свою некомпетентность в нарочито переусложненном коде, и терминологии, придуманной тобой же.

terminator-101 26.10.2014 15:08

Цитата:

Сообщение от Erolast
класса функции - так яснее?

И какие нарен классы. Нет в JS классов никаких. То что подразумевается под классом, это ссылка на конструктор, епт.

Erolast 26.10.2014 16:16

Цитата:

Сообщение от terminator-101 (Сообщение 337538)
Erolast,
Че то я не догоняю, до конца, че там происходит.

Вот пока не догоняешь, помалкивал бы :D


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