Просмотр полной версии : Запутался с прототипами...
Всем привет!
Наследуется ли свойство прототипа всем объектам?
К примеру:
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. пример абстрактный - не придирайтесь :)
Keramet,
строка 14 создали новый обьект b -- причём тут обьект a?
рони, А разве свойства прототипа не наследуются всем объектам, созданным от этого прототипа?? (в моём примере - свойство IsNamed).
рони, если можете, поясните разницу в этих двух фрагментах:
function SomeF() {
this.name = "";
}
SomeF.prototype.IsNamed = false;
function SomeF() {
this.name = "";
this.IsNamed = false;
}
Я просто считал, что во втором примере свойство IsNamed уникально для каждого объекта; а в первом - все объекты имеют одно и тоже значение, и если в одном объекте свойство изменится - то это изменение касается сразу всех объектов.
Keramet,
поясните разницу
лучше подождать специалистов ооп
:) ок. а они появятся в этом году? И, кстати, кто на форуме считается спецом ООП?
кто на форуме считается спецом ООП?
foo сейчас это ник callbackhell (http://javascript.ru/forum/members/45447-callbackhell/) :)
в случае примитива оба варианта одинаковы, если обьект то во первом варианте будет один обьект для всех, пусть меня поправят если не так.
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);
...
в случае примитива оба варианта одинаковы, если обьект то во первом варианте будет один обьект для всех, пусть меня поправят если не так.
если один объект для всех (как и я думал), почему тогда в моём примере выдаёт false ?
Ruslan_xDD,
вот 2 фрагмента, можете объяснить в чём разница будет?
function SomeF() {
this.name = "";
}
SomeF.prototype.IsNamed = false;
function SomeF() {
this.name = "";
this.IsNamed = false;
}
почему тогда в моём примере выдаёт 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]);
Я разобрался!! :)
Всем привет!
Наследуется ли свойство прототипа всем объектам?
К примеру:
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 (что и требовалось). Всем спасибо!
vBulletin® v3.6.7, Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot