Javascript псевдоклассическое наследование против функционального наследования - PullRequest
1 голос
/ 23 ноября 2011

Я недавно играл с javascript и пытаюсь осознать преимущества псевдоклассического наследования (как описано Крокфордом с использованием свойства prototype объектов). Крокфорд говорит, что он редко использует его и предпочитает функциональный подход, то есть создание функции, которая дополняет объект, такой как

var obj = function() {
  var self = {};
  self.method = function() {
  };
  return self;
}

Я предпочитаю такой подход, он легче для понимания и кажется гибким.

Однако я вижу много кода, который все еще использует свойство prototype, включая популярные фреймворки, такие как jQuery. Мне интересно, каковы преимущества? Мое понимание использования свойства prototype заключается в том, что оно дает нам возможность спросить, является ли объект конкретным типом, пройдя через цепочку прототипов. Однако, будучи динамическим языком, не лучше ли спросить, может ли объект что-то сделать, а не то, чем он является?

Ответы [ 5 ]

4 голосов
/ 23 ноября 2011

Преимущество использования prototype вместо этого подхода - эффективность. Каждый экземпляр объекта, выполненный «классическим» способом (с использованием prototype), будет совместно использовать методы, а функциональный подход создаст новые методы для каждого.

3 голосов
/ 23 ноября 2011

Да, обычно «лучше спросить, может ли объект что-то сделать, а не то, что он есть» (иногда его называют «типизацией утки»), потому что если объект выглядит как утка и крякает как утка ...).Иногда, однако, вы действительно хотите узнать, является ли объект, например, массивом, а не просто объектом, обладающим свойством длины.

Однако прототип или псевдоклассический подход также имеет производительностьПреимущество при создании большого количества объектов.

Также намного проще переопределить метод, используя псевдоклассический подход.См. Объяснение на https://stackoverflow.com/q/4508498/9897.

1 голос
/ 23 ноября 2011

Люди используют прототип, потому что это конструкция наследования.

Если вы хотите наследовать методы и свойства от другого объекта, тогда у вас есть для использования прототипа.

var Proto = {
  method: function () { }
}

var obj = function() {
  return Object.create(Proto);
}
1 голос
/ 23 ноября 2011

Я думаю, что два относительно важных аспекта - это скорость и использование оперативной памяти.Если ваш конструктор создает новые экземпляры всех этих методов, это замедлит ваш код и может также привести к сохранению их внешней области (функции конструктора), что приведет к увеличению использования ОЗУ.

Доказательство: http://jsperf.com/in-constr-vs-on-proto - по крайней мере, в Chrome, выполнение в конструкторе на 89% медленнее.

0 голосов
/ 02 августа 2013

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

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

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

...