Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 02.01.2016, 19:48
Профессор
Отправить личное сообщение для Keramet Посмотреть профиль Найти все сообщения от Keramet
 
Регистрация: 30.12.2015
Сообщений: 194

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

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

Эти фрагменты эквивалентны или нет?
Ответить с цитированием
  #2 (permalink)  
Старый 02.01.2016, 20:19
Аспирант
Посмотреть профиль Найти все сообщения от callbackhell
 
Регистрация: 29.12.2015
Сообщений: 58

Да, но возможно это скажется на производительности.
Ответить с цитированием
  #3 (permalink)  
Старый 02.01.2016, 20:23
Аватар для vasa_c
Профессор
Отправить личное сообщение для vasa_c Посмотреть профиль Найти все сообщения от vasa_c
 
Регистрация: 12.03.2008
Сообщений: 183

в изначальном prototype могут быть всякие полезности. например свойство constructor по которому можно пройтись по цепочке прототипов.
во втором случае его не будет.
Ответить с цитированием
  #4 (permalink)  
Старый 02.01.2016, 20:27
Аспирант
Посмотреть профиль Найти все сообщения от callbackhell
 
Регистрация: 29.12.2015
Сообщений: 58

Сообщение от vasa_c
во втором случае его не будет.
можно явно указать его. Но вообще, конструкторами пользуются только идиоты(коих большинство, к сожалению). А по цепочкам прототипов ты и без этого говна можешь пройтись, есть __proto__
Ответить с цитированием
  #5 (permalink)  
Старый 02.01.2016, 20:30
Профессор
Отправить личное сообщение для Keramet Посмотреть профиль Найти все сообщения от Keramet
 
Регистрация: 30.12.2015
Сообщений: 194

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 ) ;


дают разные результаты. В чём подвох - не пойму
Ответить с цитированием
  #6 (permalink)  
Старый 02.01.2016, 20:38
Аспирант
Посмотреть профиль Найти все сообщения от callbackhell
 
Регистрация: 29.12.2015
Сообщений: 58

Сообщение от Keramet
В чём подвох - не пойму
Да, это все не будет работать, но оно не нужно в реальном коде, забейте. Эти ссылки скрыты и они создаются нейтивом
Ответить с цитированием
  #7 (permalink)  
Старый 02.01.2016, 20:40
Профессор
Отправить личное сообщение для Keramet Посмотреть профиль Найти все сообщения от Keramet
 
Регистрация: 30.12.2015
Сообщений: 194

Сообщение от callbackhell Посмотреть сообщение
... Но вообще, конструкторами пользуются только идиоты(коих большинство, к сожалению)...
А можно уточнить, чем так плохи конструкторы и чем пользуется "меньшинство" ?
Ответить с цитированием
  #8 (permalink)  
Старый 02.01.2016, 20:46
Профессор
Отправить личное сообщение для Keramet Посмотреть профиль Найти все сообщения от Keramet
 
Регистрация: 30.12.2015
Сообщений: 194

Сообщение от callbackhell Посмотреть сообщение
Да, это все не будет работать, но оно не нужно в реальном коде, забейте. Эти ссылки скрыты и они создаются нейтивом
Возможно мои размышления наивны (я только начал изучение ДжС), но при нарушении цепочки прототипов, я не смогу полноценно реализовать наследование. поправьте, если я неправ
Ответить с цитированием
  #9 (permalink)  
Старый 02.01.2016, 20:47
Аспирант
Посмотреть профиль Найти все сообщения от callbackhell
 
Регистрация: 29.12.2015
Сообщений: 58

Вы к примеру, можете сделать вот так
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. Конструкторы имеет смысл пользовать только для производительности.
Ответить с цитированием
  #10 (permalink)  
Старый 02.01.2016, 20:49
Аспирант
Посмотреть профиль Найти все сообщения от callbackhell
 
Регистрация: 29.12.2015
Сообщений: 58

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ссылка на объект через агрумент kuzroman Events/DOM/Window 4 03.11.2015 22:57
определение времени при событии mouseOver greenred Events/DOM/Window 1 13.02.2012 23:28
как заполнить объект через цикл? daniel20 jQuery 1 29.12.2011 11:22
Получить объект содержащий caller no_alex Общие вопросы Javascript 14 20.03.2009 21:37
XMLHTTPRequest передача имя через POST dds AJAX и COMET 0 14.08.2008 14:44