Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Запутался с прототипами... (https://javascript.ru/forum/misc/60461-zaputalsya-s-prototipami.html)

Keramet 31.12.2015 19:45

Запутался с прототипами...
 
Всем привет!
Наследуется ли свойство прототипа всем объектам?
К примеру:

function SomeF() {
  this.name = "";
}
SomeF.prototype.IsNamed = false;
SomeF.prototype.SetName = function(txt) {
   this.name = txt;
   this.IsNamed = true;
}
var a = new SomeF();
alert(a.IsNamed);
a.SetName("AAA");
alert(a.IsNamed);

var b = new SomeF();
alert(b.IsNamed);

Разве не должна строка 15 выдать true?

P.S. пример абстрактный - не придирайтесь :)

рони 31.12.2015 20:02

Keramet,
строка 14 создали новый обьект b -- причём тут обьект a?

Keramet 31.12.2015 20:06

рони, А разве свойства прототипа не наследуются всем объектам, созданным от этого прототипа?? (в моём примере - свойство IsNamed).

Keramet 31.12.2015 20:08

рони, если можете, поясните разницу в этих двух фрагментах:

function SomeF() {
  this.name = "";
}
SomeF.prototype.IsNamed = false;


function SomeF() {
  this.name = "";
  this.IsNamed = false;
}

Я просто считал, что во втором примере свойство IsNamed уникально для каждого объекта; а в первом - все объекты имеют одно и тоже значение, и если в одном объекте свойство изменится - то это изменение касается сразу всех объектов.

рони 31.12.2015 20:20

Keramet,
Цитата:

Сообщение от Keramet
поясните разницу

лучше подождать специалистов ооп

Keramet 31.12.2015 20:23

:) ок. а они появятся в этом году? И, кстати, кто на форуме считается спецом ООП?

рони 31.12.2015 20:42

Цитата:

Сообщение от Keramet
кто на форуме считается спецом ООП?

foo сейчас это ник callbackhell :)
в случае примитива оба варианта одинаковы, если обьект то во первом варианте будет один обьект для всех, пусть меня поправят если не так.

рони 31.12.2015 20:48

Keramet,
может вам singleton нужен?

ruslan_mart 31.12.2015 20:49

Цитата:

Сообщение от рони
foo сейчас это ник callbackhell

Это шутка? :D

Keramet, значение IsNamed будет уникальным для каждого экземпляра, аналогично public var в классах. Но это не работает для массивов и объектов, так как там значение наследуется по ссылке.

function MyClass() {

};
MyClass.prototype.foo = [];

var a = new MyClass;
a.foo.push(123);

var b = new MyClass;
b.foo.push(456);

alert(a.foo == b.foo);

Keramet 31.12.2015 21:46

Цитата:

Сообщение от рони (Сообщение 402136)
...
в случае примитива оба варианта одинаковы, если обьект то во первом варианте будет один обьект для всех, пусть меня поправят если не так.

если один объект для всех (как и я думал), почему тогда в моём примере выдаёт false ?


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