function MyClass () {...};MyClass.prototype = MyClass;- считается вредным? - PullRequest
1 голос
/ 14 ноября 2010

Очевидно, в JavaScript есть идиома для реализации методов экземпляра на основе классов следующим образом:

function MyClass(){...}
MyClass.prototype.methodA = function(){...}
MyClass.prototype.methodB = function(){...}
...

Почему люди не используют вместо этого эту менее многословную форму:

function MyClass(){...}
MyClass.prototype = MyClass;
MyClass.methodA = function(){...}
MyClass.methodB = function(){...}

Этоочевидно, не работает, если MyClass должен наследовать от некоторого базового класса (в этом случае обычно следует устанавливать прототип на новый экземпляр базового класса).

Однако, иерархия с глубоким наследованием в наши дни становится редкостью (спасибопрятаться от печатания и смешивать между прочим).

Я что-то упустил?

Делает ли MyClass.prototype = MyClass .constuctor более беспорядочным, чем он есть сейчас?Это мешает плохим способом с typeof, instanceof или даже getPrototypeOf ()?

Должен ли он быть повышен или считаться вредным?

Ответы [ 2 ]

2 голосов
/ 14 ноября 2010

Может быть, потому что есть еще менее многословная форма?

MyClass.prototype = {
    methodA: function(){},
    methodB: function(){}
};

Это становится чище, чем больше у вас методов, кроме этого вы просто переопределяете прототип по умолчанию и все, что было на нем.

1 голос
/ 14 ноября 2010

Я думаю, что это бессмысленно, и это настраивает вас на потенциальную проблему, если у одного из ваших методов есть имя, которое скрывает собственный метод от Function.prototype.

Вы всегда можете инициализировать прототип так:

function MyConstructor() { ... }

MyConstructor.prototype = {
  myMethod: function() { ... },
  whatever: null
};

edit - если вам не нравится создавать объектные константы (и я должен сказать, что если вы собираетесь много программировать в Javascript, я предлагаю вам попробоватьчтобы привыкнуть к ним), вы можете просто сделать это:

MyConstructor.prototype = {};
MyConstructor.prototype.myMethod = function() { ... };

Мне не нравится так много печатать, лично.

...