powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Одному мне не хватает этого в js?
25 сообщений из 81, страница 1 из 4
Одному мне не хватает этого в js?
    #38519538
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.

Мне вдруг стало интересно, одному мне это в js мешает при решении более-менее сложных задач:
1. отсутствие полноценного механизма наследования
2. отсутствие проверки на валидность переданных в функцию параметров
3. отсутствие возможности перегрузки методов (при разных входных параметрах разная логика)

Ну то есть сочтёт ли кто-то полезным такой код?
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
Object.prototype.ext = function(construct, args){
  construct.apply(this, args);
  this._prototypes.push(construct);
}

Object.prototype.instanceOf = function(className){
  if(this.constructor.name===className) return true;
  if(typeof(this._prototypes)==='undefined') return false;
  var res = false;
  for(var i=0; i<this._prototypes.length; i++){
    if(this._prototypes[i].name===className){
      res=true;
      break;
    }
  }
  return res;
}

function validateArguments(num, types, args){
  if(args.length<num){
    throw new Error('too few arguments in function '+args.callee.name);
  }
  if(args.length>num){
    throw new Error('too many arguments in function '+args.callee.name);
  }
  for(var i=0; i<args.length; i++){
    if(!args[i].instanceOf(types[i]))
      throw new Error('argument number '+(i+1)+' in function must be a '+types[i]+' but '+args[i].constructor.name+' is given');
  }
}

function TObject(){
  this._prototypes=[];
}



Сейчас вот на основании написанного кода думаю как можно реализовать перегрузку методов (понятное дело полноценную сделать не получится, но возможно выйдет свинтить что-то удобное, что сможет восполнить отсутствие данного функционала).

Сейчас готовы только первых 2 пункта. Используются приблизительно вот так:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
function MyTestObject(){
  this.ext(TObject, []);
  this.tryVal = function tryVal(a1, a2, a3){
    validateArguments(3, ['String', 'Number', 'TObject'], arguments);
  }
}
var t = new MyTestObject();
t.tryVal(10,'hi', t);



Получим соответственно эксепшены, в случае, если переданные параметры не соответствуют ожидаемым.

В общем, всё это не имеет особого смысла, и мне просто скучно было вчера и я начал фигнёй маяться? Или моя идея реально может быть полезной? (особенно ещё не реализованный третий пункт)
...
Рейтинг: 0 / 0
Одному мне не хватает этого в js?
    #38519571
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПрограмёрМне вдруг стало интересно, одному мне это в js мешает при решении более-менее сложных задач:Это мешает тем, кто не может избавиться от шаблонов ООП. Ты не один такой :)

Более-менее сложные задачи нужно решать с помощью библиотек и фреймворков. Например, механизм прототипирования в ExtJS ничуть не хуже ооп-наследования.

ПрограмёрНу то есть сочтёт ли кто-то полезным такой код?И таких кодов много, но широкого распространения они не получили.

Програмёрособенно ещё не реализованный третий пунктПерегрузка это синтаксический прием, он имеет смысл лишь при поддержке на уровне синтаксиса самого языка. В js нельзя записать одновременно function xxx(a,b,c) и function xxx(x,y), в итоге будет видна только последняя функция. А это значит, что все равно придется вручную разруливать разную логику в рамках одной функции или разносить одноименные функции про разным областям видимости. И ради чего? Перегрузка призвана уменьшить количество писанины и сделать ее более прозрачной для понимания. А насильное внедрение ее видимости в js приведет к обратному.

Если же хочется поиметь полноценные 1 и 2 пункты, советую посмотреть сюда .
...
Рейтинг: 0 / 0
Одному мне не хватает этого в js?
    #38520082
Фотография Малыхин Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все недостатки надуманны
1. в JS присутствует полноценный механизм наследования. Другое дело что он в корне отличается от механизма в Java,C#,C++
2. в JS нет строгой типизации т.е. если нет строгих типов данных то и проверять их не нужно можно накидать сверху костылей с проверкой типов но по моему не стоит (нужен конкретный пример на котором видно нужна ли проверка типов или же можно обойтись без нее)
3. опять же вопрос типов данных

Имхо: на лицо попытка превратить JS в другой язык
Имхо2: Нужно быть аккуратнее с Object.prototype.
...
Рейтинг: 0 / 0
Одному мне не хватает этого в js?
    #38520246
Фотография VladislavVV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Многие ответы на вопросы топикстартера есть в книге "JavaScript Шаблоны" Стоян Стефанов
Если надо - пишите, поделюсь

Стефанов С.
JavaScript. Шаблоны. – Пер. с англ. – СПб.: Символ-Плюс, 2011. – 272 с., ил.
ISBN 978-5-93286-208-7
Разработчики серверных, клиентских или настольных приложений на Java-
Script нередко сталкиваются с проблемами, связанными с объектами, функци-
ями, наследованием и другими особенностями этого языка. Какие же приемы
разработки приложений на JavaScript являются наиболее удачными? Данная
книга дает ответ на этот вопрос, предлагая большое количество различных
шаб лонов программирования на JavaScript, таких как «единственный объект»
(singleton), «фабрика» (factory), «декоратор» (deco rator) и другие. Можно ска-
зать, что они являются не только методами решения наиболее типичных задач
разработки ПО, но и заготовками решений для целых категорий таких задач.
Использование шаб лонов при программировании на языке Java Script имеет
свои особенности. Некоторые из них, разработанные с позиций языков со стро-
гим контролем типов, таких как C++ и Java, не могут непосредственно приме-
няться в языках с динамической типизацией, таких как Java Script. Для таких
шаб лонов в языке Java Script имеются более простые альтернативы.
Написанная экспертом по языку JavaScript Стояном Стефановым – ведущим
специалистом компании Yahoo! и создателем инструмента оптимизации про-
изводительности веб-страниц YSlow 2.0, – книга включает практические со-
веты по реализации каждого из рассматриваемых шаблонов с примерами про-
граммного кода. Автор также приводит антишаблоны – приемы программиро-
вания, которых следует по возможности избегат
...
Рейтинг: 0 / 0
Одному мне не хватает этого в js?
    #38520445
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Малыхин СергейВсе недостатки надуманны
1. в JS присутствует полноценный механизм наследования. Другое дело что он в корне отличается от механизма в Java,C#,C++
2. в JS нет строгой типизации т.е. если нет строгих типов данных то и проверять их не нужно можно накидать сверху костылей с проверкой типов но по моему не стоит (нужен конкретный пример на котором видно нужна ли проверка типов или же можно обойтись без нее)
3. опять же вопрос типов данных

Имхо: на лицо попытка превратить JS в другой язык
Имхо2: Нужно быть аккуратнее с Object.prototype.

насчёт пункта 2 полностью верно. Как таковой он в принципе не сильно востребован... лишь иногда для защиты от глупой ошибки программиста (ну то есть, если пишущий не читает документацию по методам перед их вызовами). В основном это как предисловие к пункту 3 (ещё не знаю насколько он реализуем. Хочу, что бы было удобно и как уже написали, что бы это не приводило к написанию жутких невостребованных конструкций).

А вот насчёт первого пункта. Может я не прав, но... насколько просто в js на прототипах создать такой конструктор, который бы в себе вызывал конструктор родителя с определённым перечнем аргументов? Насколько я знаю без дополнительных манипуляций этого сделать нельзя (то есть нету определённой в языке конструкции, которая позволила бы это сделать).
Я не прав? Если прав, то тогда механизм наследования в js есть, и для большинства задач он достаточный, но всё же не полноценный.
...
Рейтинг: 0 / 0
Одному мне не хватает этого в js?
    #38520447
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёр,

Вам не хватает другого языка!
Вы пытаетесь натянуть парадигмы одного языка на другой - это как если бы вы к молотку пытались привинтить возможности топора! )
...
Рейтинг: 0 / 0
Одному мне не хватает этого в js?
    #38520459
sp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JavaScript не предназначен для монолитных приложений как другие языки - отсюда классовость как 5я нога у собаки!
Используйте модули и extensions - в этом сила javascript.
Рекомендую обратить внимание на кучу фреймворков, применяющих все прелести языка, для создания больших приложений - Backbone, Angular, Ember и другие.
...
Рейтинг: 0 / 0
Одному мне не хватает этого в js?
    #38520482
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sp, под монолитными приложениями Вы что понимаете?
...
Рейтинг: 0 / 0
Одному мне не хватает этого в js?
    #38520505
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spПрограмёр,

Вам не хватает другого языка!
Вы пытаетесь натянуть парадигмы одного языка на другой - это как если бы вы к молотку пытались привинтить возможности топора! )

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

А вот насчёт парадигмы... Не отрицаю, не хватает мне классового наследования в js. А про неудобство использования наследования на прототипах в js (для меня по крайней мере) я написал в прошлом сообщении.

Можно использовать конечно фреймворки, разные модули и библиотеки... Но незачем это делать в случае, когда требуется лишь добавить мизерные изменения в обычный функционал. Это как например подключать jquery только потому, что в одной строчке вдруг потребовалось обратиться к элементу по селектору, или переносить сайт на yii или другой фреймворк только потому, что на сайте-визитке надо создать форму регистрации пользователей для механизма рассылок например.

Понимаете о чём я? Вот мне обычно требуются лишь мизерные (описанные мной) изменения в стандартном функционале и синтаксисе js. Для этого использовать целые модули типа TypeScript (кстати, спасибо за ссылку, раньше слышал только про coffeScript или как то так) и потом искать софт, поддерживающий автодополнение и подсветку нового синтаксиса не вижу смысла.

Потому то и решил несколько строчек написать "для души"... и подумал, а вдруг ещё кому пригодится... может кто ещё тот же дискомфорт в js ощущает, что и я. И может кто идейку подкинет какую. :)
...
Рейтинг: 0 / 0
Одному мне не хватает этого в js?
    #38520510
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёр, validateArguments я бы на декоратор заменил.
...
Рейтинг: 0 / 0
Одному мне не хватает этого в js?
    #38520519
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПрограмёрМожет я не прав, но... насколько просто в js на прототипах создать такой конструктор, который бы в себе вызывал конструктор родителя с определённым перечнем аргументов? Насколько я знаю без дополнительных манипуляций этого сделать нельзя (то есть нету определённой в языке конструкции, которая позволила бы это сделать).
Я не прав? Прав, без доп. манипуляций нельзя. Вот как это решается в TS:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
/*классическое ооп-наследование с вызовом базового конструктора с параметром*/
class Animal {
    constructor(public name: string) { }
    move(meters: number) {
        alert(this.name + " moved " + meters + "m.");
    }
}

class Snake extends Animal {
    constructor(name: string) { super(name); }
    move() {
        alert("Slithering...");
        super.move(5);
    }
}

class Horse extends Animal {
    constructor(name: string) { super(name); }
    move() {
        alert("Galloping...");
        super.move(45);
    }
}

var sam = new Snake("Sammy the Python");
var tom: Animal = new Horse("Tommy the Palomino");

sam.move();
tom.move(34);

/*как это транслируется в js*/

var __extends = this.__extends || function (d, b) {
    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
    function __() { this.constructor = d; }
    __.prototype = b.prototype;
    d.prototype = new __();
};
var Animal = (function () {
    function Animal(name) {
        this.name = name;
    }
    Animal.prototype.move = function (meters) {
        alert(this.name + " moved " + meters + "m.");
    };
    return Animal;
})();

var Snake = (function (_super) {
    __extends(Snake, _super);
    function Snake(name) {
        _super.call(this, name);
    }
    Snake.prototype.move = function () {
        alert("Slithering...");
        _super.prototype.move.call(this, 5);
    };
    return Snake;
})(Animal);

var Horse = (function (_super) {
    __extends(Horse, _super);
    function Horse(name) {
        _super.call(this, name);
    }
    Horse.prototype.move = function () {
        alert("Galloping...");
        _super.prototype.move.call(this, 45);
    };
    return Horse;
})(Animal);

var sam = new Snake("Sammy the Python");
var tom = new Horse("Tommy the Palomino");

sam.move();
tom.move(34);


ПрограмёрЕсли прав, то тогда механизм наследования в js есть, и для большинства задач он достаточный, но всё же не полноценный.Нет наследования в js, есть прототипирование. Точка. Это все равно что сказать, что в js есть jquery. Любой механизм js-наследования — не В , а НА js.

Малыхин Сергей 1. в JS присутствует полноценный механизм наследования. Другое дело что он в корне отличается от механизма в Java,C#,C++Такие бредовые высеры лишь запутывают понимание ситуации. В корне отличающийся механизм это прототип. У него есть собственное название, схерали называть его "наследованием"?
...
Рейтинг: 0 / 0
Одному мне не хватает этого в js?
    #38520555
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAПрограмёр, validateArguments я бы на декоратор заменил.

Правильно понял?
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Object.prototype.validateArguments = function(types, func){
  var obj = this;
  return function(){
    if(arguments.length<types.length){
      throw new Error('too few arguments in function '+func.name);
    }
    if(arguments.length>types.length){
      throw new Error('too many arguments in function '+func.name);
    }
    for(var i=0; i<arguments.length; i++){
      if(!arguments[i].instanceOf(types[i]))
        throw new Error('argument '+(i+1)+' in function '+func.name+' must be a '+types[i]+' but '+arguments[i].constructor.name+' is given');
    }
    func.apply(obj, arguments);
  }
}



тогда объявление метода такое:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
function MyTestObject(){
  this.ext(TObject, []);
  this.tryVal = this.validateArguments(
    ['String', 'Number', 'TObject'], function tryVal(a1, a2, a3){
    }
  );
}
...
Рейтинг: 0 / 0
Одному мне не хватает этого в js?
    #38520607
Фотография Малыхин Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyТакие бредовые высеры лишь запутывают понимание ситуации. В корне отличающийся механизм это прототип. У него есть собственное название, схерали называть его "наследованием"?
Честное пионерское!!! на JavaScript можно создавать объекты на основании уже существующих просто добавляя в них свойства и методы.


автор... насколько просто в js на прототипах создать такой конструктор, ... Опять же мышление из другой философии(языка программирования) ...
Имхо в JS не стоит создавать новые объекты нужно расширять и изменять уже существующие
т.е. использование конструктора подразумевает создание объекта а не изменение уже существующего
т.е. попытка использовать классовый подход в прототипированном языке
...
Рейтинг: 0 / 0
Одному мне не хватает этого в js?
    #38520644
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Малыхин СергейAntonariyТакие бредовые высеры лишь запутывают понимание ситуации. В корне отличающийся механизм это прототип. У него есть собственное название, схерали называть его "наследованием"?
Честное пионерское!!! на JavaScript можно создавать объекты на основании уже существующих просто добавляя в них свойства и методы.


автор... насколько просто в js на прототипах создать такой конструктор, ... Опять же мышление из другой философии(языка программирования) ...
Имхо в JS не стоит создавать новые объекты нужно расширять и изменять уже существующие
т.е. использование конструктора подразумевает создание объекта а не изменение уже существующего
т.е. попытка использовать классовый подход в прототипированном языке

давайте так... просто нужна аналогия. вот пример классового наследования:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
class Animal{
  public:
    Animal(int legs){
      this->legs = legs;
    }
    int getLegs(){
      return this->legs;
    }
  private:
    int legs;
}

class Rabbit: public Animal{
  public:
    Rabbit(int jumpLength): Animal(4){
      this->jumpLength = jumpLength;
    }
  private:
    int jumpLength;
}
class Human: public Animal{
  public:
    Human(int height): Animal(2){
      this->height = height;
    }
  private:
    int height;
}
class Bird: public Animal{
  public:
    Bird(bool canFly, int legs): Animal(legs){
      this->canFly = canFly;
    }
  private:
    bool canFly;
}



Каким образом можно повторить данную структуру на прототипах?

Ну то есть, что бы например вот это вернуло "2"
Код: plaintext
1.
2.
Bird b = new Bird(true, 2);
cout << b.getLegs();
...
Рейтинг: 0 / 0
Одному мне не хватает этого в js?
    #38520654
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Одному мне не хватает этого в js?
Ага.
...
Рейтинг: 0 / 0
Одному мне не хватает этого в js?
    #38520689
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Малыхин СергейAntonariyТакие бредовые высеры лишь запутывают понимание ситуации. В корне отличающийся механизм это прототип. У него есть собственное название, схерали называть его "наследованием"?
Честное пионерское!!! на JavaScript можно создавать объекты на основании уже существующих просто добавляя в них свойства и методы.Ну и при чем тут наследование?


Малыхин СергейИмхо в JS не стоит создавать новые объекты нужно расширять и изменять уже существующие
т.е. использование конструктора подразумевает создание объекта а не изменение уже существующего
т.е. попытка использовать классовый подход в прототипированном языке+1

Еще не стоит забывать, что в Java,C#,C++ и т.п. каждый класс является уникальным объектным типом, а ООП предлагает контроль и навигацию по этим типам (с помощью среды разработки), да и вообще существует, всего лишь ради одной цели — удобства разработки. JS слабо типизирован, контроль и навигация невозможны, следовательно все ооп-удобства вылетают в трубу, а вместо них появляется бахрома из всяких
Код: javascript
1.
2.
3.
4.
    __extends(Snake, _super);
    function Snake(name) {
        _super.call(this, name);
    }

которая в ООП-языках плетется компилятором, а не разработчиком, и про которую нельзя забывать в js.
Писанина должна стремиться к нулю, а функционал на ней основанный — к бесконечности.
...
Рейтинг: 0 / 0
Одному мне не хватает этого в js?
    #38520710
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёр давайте так... просто нужна аналогия. вот пример классового наследования:
...
Каким образом можно повторить данную структуру на прототипах?Чем мой пример не подходит? Он описывает практически ту же самую структуру.
...
Рейтинг: 0 / 0
Одному мне не хватает этого в js?
    #38520783
Фотография Малыхин Сергей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНу и при чем тут наследование?
Просто я наивно полагал что наследование это механизм позволяющий создавать новый объект/класс на основе уже существующего просто добавив или изменив его свойства и методы.

В прото языках используются реальные объекты для наследования
В классовой модели наследуется описание классов родителей а не реальные объекты

Это разные подходы к наследованию
...
Рейтинг: 0 / 0
Одному мне не хватает этого в js?
    #38520842
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Малыхин СергейавторНу и при чем тут наследование?
Просто я наивно полагал что наследование это механизм позволяющий создавать новый объект/класс на основе уже существующего просто добавив или изменив его свойства и методы."Наследование" слишком увязло в ООП, и при его употреблении слишком сильны ассоциации с ООП, которые подсознательно тащат в js ооп-шаблоны разработки. Однако вменяемого термина для js нет, а мое "прототипирование" даже с точки зрения русского языка выглядит коряво. В википедии используется словосочетание "прототипное наследование".
...
Рейтинг: 0 / 0
Одному мне не хватает этого в js?
    #38520891
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёрнасколько просто в js на прототипах создать такой конструктор, который бы в себе вызывал конструктор родителя с определённым перечнем аргументов? Насколько я знаю без дополнительных манипуляций этого сделать нельзя (то есть нету определённой в языке конструкции, которая позволила бы это сделать).конструкция есть, но весьма длинная:
http://javascript.ru/tutorial/object/inheritance#vyzov-roditelskih-metodov
только в функции extend (см. выше) надо ссылку на родительский прототип сделать.
главный минус - в таких вызовах упоминается имя класса, его сложно будет поменять.
а в остальном, каких-либо существенных недостатков такое наследование не имеет.

вообще, из ООП в js нет только инкапсуляции, приватных частей класса.
оное можно сделать замыканием, но тогда придется забыть о прототипах.
впрочем, инкапсуляция есть самый бесполезный компонент в ООП, вопрос решается соглашением об именованиях, "_" в начале и т.д.
...
Рейтинг: 0 / 0
Одному мне не хватает этого в js?
    #38520897
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyПрограмёр давайте так... просто нужна аналогия. вот пример классового наследования:
...
Каким образом можно повторить данную структуру на прототипах?Чем мой пример не подходит? Он описывает практически ту же самую структуру.

теоретически вполне подходит. А вот на практике )) ЭТО ЖЕ НЕ УДОБНО!!! Как по мне, то это ооооочень не удобно (если реализовывать это всё вручную, а не доверять TypeScript'у) :)

Я понимаю, что в TypeScript всё по фэншую. Но в самостоятельной реализации, разве моя this.ext чем-то уступает приведённой реализации в функционале? При том, что в разы прозрачнее работает (любой начинающий освоит принцип)
...
Рейтинг: 0 / 0
Одному мне не хватает этого в js?
    #38520961
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наследование не нужно, вот например один из подходов миксы http://jslang.info/blog/2012/functional-mixins

Валидацию параметров просто сделать метапрограммингом, но вообще это не нужно

Мультиметоды были бы классны, их не хватает, их можно сделать метапрограммированием, но в ущерб производительности.
...
Рейтинг: 0 / 0
Одному мне не хватает этого в js?
    #38521025
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПрограмёрskyANAПрограмёр, validateArguments я бы на декоратор заменил.

Правильно понял?
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Object.prototype.validateArguments = function(types, func){
  var obj = this;
  return function(){
    if(arguments.length<types.length){
      throw new Error('too few arguments in function '+func.name);
    }
    if(arguments.length>types.length){
      throw new Error('too many arguments in function '+func.name);
    }
    for(var i=0; i<arguments.length; i++){
      if(!arguments[i].instanceOf(types[i]))
        throw new Error('argument '+(i+1)+' in function '+func.name+' must be a '+types[i]+' but '+arguments[i].constructor.name+' is given');
    }
    func.apply(obj, arguments);
  }
}



тогда объявление метода такое:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
function MyTestObject(){
  this.ext(TObject, []);
  this.tryVal = this.validateArguments(
    ['String', 'Number', 'TObject'], function tryVal(a1, a2, a3){
    }
  );
}

Правильно. Вот только зачем её в прототип запихивать, не понятно.
...
Рейтинг: 0 / 0
Одному мне не хватает этого в js?
    #38521042
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
privateНаследование не нужно, вот например один из подходов миксы http://jslang.info/blog/2012/functional-mixins

Валидацию параметров просто сделать метапрограммингом, но вообще это не нужно

Мультиметоды были бы классны, их не хватает, их можно сделать метапрограммированием, но в ущерб производительности.

ну вот с мультиметодами реализация
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
Object.prototype.ext = function(construct, args){
  construct.apply(this, args);
  this._prototypes.push(construct);
}

Object.prototype.instanceOf = function(className){
  if(this.constructor.name===className) return true;
  if(typeof(this._prototypes)==='undefined') return false;
  var res = false;
  for(var i=0; i<this._prototypes.length; i++){
    if(this._prototypes[i].name===className){
      res=true;
      break;
    }
  }
  return res;
}

Object.prototype._ = function(types, func){
  var obj = this;
  this[func.name] = function(){
    var err = TypeError();
    var trace = err.stack.split("\n").slice(3).join("\n");
    if(arguments.length<types.length){
      err.message = 'too few arguments in function '+obj.constructor.name+'.'+func.name+"\n"+trace;
      throw err;
    }
    if(arguments.length>types.length){
      err.message = 'too many arguments in function '+obj.constructor.name+'.'+func.name+"\n"+trace;
      throw err;
    }
    for(var i=0; i<arguments.length; i++){
      if(!arguments[i].instanceOf(types[i])){
        err.message = 'argument '+(i+1)+' in function '+obj.constructor.name+'.'+func.name+' must be a '+types[i]+' but '+arguments[i].constructor.name+" is given\n"+trace;
        throw err;
      }
    }
    func.apply(obj, arguments);
  }
}

Object.prototype.__ = function(types, func){
  var obj = this;
  var f = this[func.name];
  this[func.name] = function(){
    var fail = false;
    var err = TypeError();
    var trace = err.stack.split("\n").slice(3).join("\n");
    try{
      var argsType = [];
      for (var i=0; i<arguments.length; i++){
        argsType.push(arguments[i].constructor.name);
      }
      if(arguments.length<types.length){
        err.message = "there are no method "+obj.constructor.name+'.'+func.name+"("+argsType.join(", ")+")\n"+trace;
        throw err;
      }
      if(arguments.length>types.length){
        err.message = "there are no method "+obj.constructor.name+'.'+func.name+"("+argsType.join(", ")+")\n"+trace;
        throw err;
      }
      for(var i=0; i<arguments.length; i++){
        if(!arguments[i].instanceOf(types[i])){
          err.message = "there are no method "+obj.constructor.name+'.'+func.name+"("+argsType.join(", ")+")\n"+trace;
          throw err;
        }
      }
    }catch(err){
      fail = true;
      if(typeof(f)!=='undefined'){
        f.apply(obj, arguments);
      }else{
        throw err;
      }
    }
    if (!fail) func.apply(obj, arguments);
  }
}

function TObject(){
  this._prototypes=[];
}

function MyTestObject(){
  this.ext(TObject, []);
  this._(['String', 'Number', 'TObject'], function tryVal(a1, a2, a3){
    alert('hi');
  });
  
  this.__(['String', 'Number', 'TObject'], function try2(a1, a2, a3){
   alert('hi');
  });
  
  this.__(['String'], function try2(a1){
     alert('hello');
  });
}
var t = new MyTestObject();
t.try2('hi', 10, t, t);



Пока только одна проблема - это лишние данные в свойстве trace ошибки. Ну по сути, если посидеть, я думаю это решаемо.
...
Рейтинг: 0 / 0
Одному мне не хватает этого в js?
    #38521061
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёра не доверять TypeScript'уНет причин ему не доверять.

Програмёр ЭТО ЖЕ НЕ УДОБНО!!!О чем я и говорю. Вопросы удобства (в том числе) как раз и решает TS на синтаксическом уровне.

В википедии есть более выхолощенный пример:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
var Parent = function( data ) {
    this.data = data || false;
    this.public_method = function() { return 'Public Method'; }
}
 
var Child = function() {
    this.public_method = function() { return 'Redefined public method'; }
    this.getData = function() { return 'Data: ' + this.data; }
}
 
Child.prototype = new Parent('test'); //суть прототипного наследования
var Test = new Child();
 
Test.getData(); // => "Data: test"
Test.public_method(); // => "Redefined public method"
Test.data; // => "test"
...
Рейтинг: 0 / 0
25 сообщений из 81, страница 1 из 4
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Одному мне не хватает этого в js?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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