Определить прототип конструктора с помощью литерала объекта - PullRequest
1 голос
/ 31 января 2011

Какой метод ниже лучше всего определить для прототипа конструктора и почему?

Метод 1:

MyConstructor.prototype.myFunction1 = function(){};
MyConstructor.prototype.myFunction2 = function(){};

Метод 2:

MyConstructor.prototype = {
    myFunction1: function(){},
    myFunction2: function(){}
};

Меня больше всего беспокоит скорость. Спасибо!

Ответы [ 4 ]

2 голосов
/ 31 января 2011

Я бы сказал, что не будет большой разницы.Использование литерала объекта для назначения объектному прототипу - это то, что вы не можете сделать, если вы назначаете прототип в конструкторе (который иногда может быть полезен).следует написать небольшой тест производительности, используя jsperf.com .

0 голосов
/ 15 марта 2017

Вы должны использовать метод 1 . Используя метод 2 , каждый раз, когда вы создаете новый экземпляр, вы будете "заново создавать" методы, поскольку они находятся внутри конструктора.

0 голосов
/ 19 апреля 2014

Если говорить о читабельности вашего кода,

метод 1 лучше, чем метод 2.

В методе 2 проводят еще один отступ.Поэтому это затрудняет чтение кодов.

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

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

Спасибо!

0 голосов
/ 05 апреля 2011
var example = new MyConstructor();

по методу 1:

example.constructor === MyConstructor;

по методу 2:

typeof(example.constructor) === 'undefined';

Объект-прототип, который поставляется с функцией, имеет свойство constructor, которое указывает нафункция.Если вы присваиваете свойства этого объекта, вы сохраняете свойство constructor.Если вы перезаписываете свойство prototype новым объектом, вы теряете свойство constructor.

Разница в производительности минимальна.Поскольку constructor настолько хрупок, вы не можете доверять ему, поэтому я не пытаюсь сохранить его.

...