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

Мне вдруг стало интересно, одному мне это в 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
08.01.2014, 15:33
    #38519571
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одному мне не хватает этого в js?
ПрограмёрМне вдруг стало интересно, одному мне это в js мешает при решении более-менее сложных задач:Это мешает тем, кто не может избавиться от шаблонов ООП. Ты не один такой :)

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

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

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

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

Имхо: на лицо попытка превратить JS в другой язык
Имхо2: Нужно быть аккуратнее с Object.prototype.
...
Рейтинг: 0 / 0
09.01.2014, 11:00
    #38520246
VladislavVV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одному мне не хватает этого в js?
Многие ответы на вопросы топикстартера есть в книге "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
09.01.2014, 14:00
    #38520445
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одному мне не хватает этого в js?
Малыхин СергейВсе недостатки надуманны
1. в JS присутствует полноценный механизм наследования. Другое дело что он в корне отличается от механизма в Java,C#,C++
2. в JS нет строгой типизации т.е. если нет строгих типов данных то и проверять их не нужно можно накидать сверху костылей с проверкой типов но по моему не стоит (нужен конкретный пример на котором видно нужна ли проверка типов или же можно обойтись без нее)
3. опять же вопрос типов данных

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

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

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

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

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

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

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

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

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

Потому то и решил несколько строчек написать "для души"... и подумал, а вдруг ещё кому пригодится... может кто ещё тот же дискомфорт в js ощущает, что и я. И может кто идейку подкинет какую. :)
...
Рейтинг: 0 / 0
09.01.2014, 14:35
    #38520510
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одному мне не хватает этого в js?
Програмёр, validateArguments я бы на декоратор заменил.
...
Рейтинг: 0 / 0
09.01.2014, 14:40
    #38520519
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одному мне не хватает этого в js?
ПрограмёрМожет я не прав, но... насколько просто в 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
09.01.2014, 15:05
    #38520555
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одному мне не хватает этого в js?
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
09.01.2014, 15:41
    #38520607
Малыхин Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одному мне не хватает этого в js?
AntonariyТакие бредовые высеры лишь запутывают понимание ситуации. В корне отличающийся механизм это прототип. У него есть собственное название, схерали называть его "наследованием"?
Честное пионерское!!! на JavaScript можно создавать объекты на основании уже существующих просто добавляя в них свойства и методы.


автор... насколько просто в js на прототипах создать такой конструктор, ... Опять же мышление из другой философии(языка программирования) ...
Имхо в JS не стоит создавать новые объекты нужно расширять и изменять уже существующие
т.е. использование конструктора подразумевает создание объекта а не изменение уже существующего
т.е. попытка использовать классовый подход в прототипированном языке
...
Рейтинг: 0 / 0
09.01.2014, 16:02
    #38520644
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одному мне не хватает этого в js?
Малыхин Сергей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
09.01.2014, 16:09
    #38520654
ShSerge
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одному мне не хватает этого в js?
Одному мне не хватает этого в js?
Ага.
...
Рейтинг: 0 / 0
09.01.2014, 16:28
    #38520689
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одному мне не хватает этого в js?
Малыхин Сергей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
09.01.2014, 16:39
    #38520710
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одному мне не хватает этого в js?
Програмёр давайте так... просто нужна аналогия. вот пример классового наследования:
...
Каким образом можно повторить данную структуру на прототипах?Чем мой пример не подходит? Он описывает практически ту же самую структуру.
...
Рейтинг: 0 / 0
09.01.2014, 17:11
    #38520783
Малыхин Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одному мне не хватает этого в js?
авторНу и при чем тут наследование?
Просто я наивно полагал что наследование это механизм позволяющий создавать новый объект/класс на основе уже существующего просто добавив или изменив его свойства и методы.

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

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

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

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

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

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

Мультиметоды были бы классны, их не хватает, их можно сделать метапрограммированием, но в ущерб производительности.
...
Рейтинг: 0 / 0
09.01.2014, 20:42
    #38521025
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одному мне не хватает этого в js?
Програмёр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
09.01.2014, 20:54
    #38521042
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одному мне не хватает этого в js?
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
09.01.2014, 21:17
    #38521061
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Одному мне не хватает этого в js?
Програмёра не доверять 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
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Одному мне не хватает этого в js? / 25 сообщений из 81, страница 1 из 4
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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