Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Определение прототипа через объект (https://javascript.ru/forum/misc/60478-opredelenie-prototipa-cherez-obekt.html)

Keramet 02.01.2016 19:48

Определение прототипа через объект
 
Обычно прототипы определяют так:
1.
function Person() {}
Person.prototype.name = "аноним";
Person.prototype.age = 18;

А если определить прототип так:
2.
function Person() {}
Person.prototype = {
  name : "аноним",
  age : 18
};

Эти фрагменты эквивалентны или нет?

callbackhell 02.01.2016 20:19

Да, но возможно это скажется на производительности.

vasa_c 02.01.2016 20:23

в изначальном prototype могут быть всякие полезности. например свойство constructor по которому можно пройтись по цепочке прототипов.
во втором случае его не будет.

callbackhell 02.01.2016 20:27

Цитата:

Сообщение от vasa_c
во втором случае его не будет.

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

Keramet 02.01.2016 20:30

callbackhell,
Я вот тоже так думал, но:
1.
function Person() {}
var p1 = new Person();
Person.prototype.name = "Nicholas";
Person.prototype.age = 29;

var p2 = new Person();

alert ( Person.prototype.isPrototypeOf(p1) ) ;
alert ( Person.prototype.isPrototypeOf(p2) ) ;
	
alert ( p1 instanceof Person ) ;
alert ( p2 instanceof Person ) ;
	
alert ( p1.constructor ) ;
alert ( p2.constructor ) ;


2.
function Person() {}
var p1 = new Person();
Person.prototype = {
	name : "Nicholas",
	age : 29
};

var p2 = new Person();

alert ( Person.prototype.isPrototypeOf(p1) ) ;
alert ( Person.prototype.isPrototypeOf(p2) ) ;
	
alert ( p1 instanceof Person ) ;
alert ( p2 instanceof Person ) ;
	
alert ( p1.constructor ) ;
alert ( p2.constructor ) ;


дают разные результаты. В чём подвох - не пойму :(

callbackhell 02.01.2016 20:38

Цитата:

Сообщение от Keramet
В чём подвох - не пойму

Да, это все не будет работать, но оно не нужно в реальном коде, забейте. Эти ссылки скрыты и они создаются нейтивом:)

Keramet 02.01.2016 20:40

Цитата:

Сообщение от callbackhell (Сообщение 402267)
... Но вообще, конструкторами пользуются только идиоты(коих большинство, к сожалению)...

А можно уточнить, чем так плохи конструкторы и чем пользуется "меньшинство" :) ?

Keramet 02.01.2016 20:46

Цитата:

Сообщение от callbackhell (Сообщение 402271)
Да, это все не будет работать, но оно не нужно в реальном коде, забейте. Эти ссылки скрыты и они создаются нейтивом:)

Возможно мои размышления наивны (я только начал изучение ДжС), но при нарушении цепочки прототипов, я не смогу полноценно реализовать наследование. поправьте, если я неправ

callbackhell 02.01.2016 20:47

Вы к примеру, можете сделать вот так
MySuperClass = {type: "MySuperClass"}
MyClass = Object.create(MySuperClass); MyClass.type = "MyClass"
o1 = Object.create(MySuperClass)
o2 = Object.create(MyClass)

alert([o1.type, o2.type])

Это замена instanseOf. Когда вы освоитесь в прототипном программировании, вы удивитесь, насколько гибкие решения оно дает в плане ООП. А используя нативные конструкторы, а тем более es6-классы, вы опускаете язык до уровня какой-нибудь java. Конструкторы имеет смысл пользовать только для производительности.

callbackhell 02.01.2016 20:49

Цитата:

Сообщение от Keramet
но при нарушении цепочки прототипов

Нет никакого нарушения цепочек. Вы сами же эти цепочки и реализуете, в этом и заключается Ваша реализация наследования.


Часовой пояс GMT +3, время: 21:25.