Вход

Просмотр полной версии : Запутался с прототипами...


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
31.12.2015, 20:23
:) ок. а они появятся в этом году? И, кстати, кто на форуме считается спецом ООП?

рони
31.12.2015, 20:42
кто на форуме считается спецом ООП?
foo сейчас это ник callbackhell (http://javascript.ru/forum/members/45447-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
...
в случае примитива оба варианта одинаковы, если обьект то во первом варианте будет один обьект для всех, пусть меня поправят если не так.
если один объект для всех (как и я думал), почему тогда в моём примере выдаёт false ?

Keramet
31.12.2015, 21:48
Ruslan_xDD,
вот 2 фрагмента, можете объяснить в чём разница будет?
function SomeF() {
this.name = "";
}
SomeF.prototype.IsNamed = false;

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

рони
31.12.2015, 21:58
почему тогда в моём примере выдаёт false
потому что не обьект

ruslan_mart
01.01.2016, 08:06
function MyClass() {};
MyClass.prototype.isNamed = false;


var a = new MyClass();
var b = new MyClass();

alert([a.isNamed, b.isNamed]);

MyClass.prototype.isNamed = true;

alert([a.isNamed, b.isNamed]);



function MyClass() {
this.isNamed = false;
};


var a = new MyClass();
var b = new MyClass();

alert([a.isNamed, b.isNamed]);

MyClass.prototype.isNamed = true;

alert([a.isNamed, b.isNamed]);

Keramet
01.01.2016, 17:32
Я разобрался!! :)
Всем привет!
Наследуется ли свойство прототипа всем объектам?
К примеру:

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?

Для того, чтобы всё работало как надо, строку 07 - this.IsNamed = true; надо заменить на SomeF.prototype.IsNamed = true;
Тогда строка 15 будет выдавать true (что и требовалось). Всем спасибо!