Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Прототип объекта (https://javascript.ru/forum/misc/62221-prototip-obekta.html)

DivMan 31.03.2016 11:49

Прототип объекта
 
Почему при вызове computer.videocard значение не изменилось?

var computer = {
      type: Math.random().toString(36).substring(7),
      cpu: Math.random().toString(36).substring(7),
      videocard: Math.random().toString(36).substring(7)
    };

var mac;
    mac = Object.create(computer);
    mac.videocard = "nvidia"




Почему, если добавить элемент в массив, то он записывается, а строка нет?

var person = {
name: "Nicholas", 
friends: ["Shelby", "Court", "Van"]
}

var anotherPerson = Object.create(person);
anotherPerson.name = "Greg";
anotherPerson.friends.push("Rob");


person.name // Nicholas

person.friends // ["Shelby", "Court", "Van", "Rob"]

Strongman 31.03.2016 12:46

1) Я так понял, что там вся соль в прототипе. Сначала создается объект computer. Потом создается объект mac и все свойства объекта computer оказываются в прототипе. Когда делаете это: mac.videocard = "nvidia"; - то просто создается новое свойство videocard.
2) Опять-же смысл в прототипе.
var anotherPerson = Object.create(person);//- это создали объект, все свойства перелетели в прототип;
anotherPerson.name = "Greg";//- создали новое свойство
anotherPerson.name = "Nark";//- изменили это свойство
anotherPerson.friends.push("Rob");//- добавился элемент в массиве в прототипе.

Яростный Меч 31.03.2016 12:48

Цитата:

Сообщение от DivMan
mac.videocard = "nvidia";
anotherPerson.name = "Greg";

здесь свойство записывается в сам объект, а в прототипе остается старое.

т.е., для примера с компами, сначала было так
{
  __proto__: {
      type: Math.random().toString(36).substring(7),
      cpu: Math.random().toString(36).substring(7),
      videocard: Math.random().toString(36).substring(7)
  }
}

и значение mac.videocard бралось из __proto__

а после mac.videocard = "nvidia"; стало так:
{
  videocard: "nvidia",
  __proto__: {
      type: Math.random().toString(36).substring(7),
      cpu: Math.random().toString(36).substring(7),
      videocard: Math.random().toString(36).substring(7)
  }
}


videocard теперь в самом объекте

----
а массив не заменяется, просто берется тот который в прототипе.

Strongman 31.03.2016 13:54

Ну интересно они конечно в JavaScript сделали. Классов как я понял нету. Вместо классов сделали prototype.
Цитата:

Сообщение от Rise
Перелетела ссылка на объект computer.

- дак объекты mac и computer имеют один и тот же адрес что-ли(ссылку)?

DivMan 10.09.2016 10:10

Правильно ли я понял, то, что после вызова spot.sit(); у объекта spot, создаётся своё личное свойство sit? И теперь, если ещё раз его вызвать, оно будет браться не из прототипа, а на прямую? 

То есть свойство добавляется в конструктор?

http://plnkr.co/edit/pWlbvzN3Up5rRyUgtkcw?p=preview

warren buffet 11.09.2016 08:01

DivMan, выкинь свой комплюктер и займись выжиганием по дереву.

DivMan 11.09.2016 19:31

Почему?

DivMan 04.11.2016 19:32

Почему выводит undefined?

https://jsfiddle.net/1qwhk16v/


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