Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Изменение свойств прототипа (https://javascript.ru/forum/misc/40900-izmenenie-svojjstv-prototipa.html)

FanAizu 23.08.2013 20:04

Изменение свойств прототипа
 
Подскажите, пожалуйста, правильно ли я понимаю. Например, если есть объект А(у которого есть свойства test = 'hello', test2 = [0, 1, 2]) и есть объект Б, прототипом которого является объект А. В методе объекта Б если изменить значение свойства test, то это свойство будет найдено в прототипе и изменено, но при этом будет записано уже непосредственно как свойство объекта Б(то есть значение свойства test прототипа объекта Б(объект А) не изменится), и, если изменить значение свойства test2, то это свойство будет найдено в прототипе и изменено и при этом измененное значение будет записано в прототип объекта Б(объект А). Верно? То есть элементарные типы данных, такие как строки, числа изменяются непосредственно в объекте, а неэлементарные, такие как массивы, объекты меняются в прототипе. Верно?

bes 23.08.2013 20:16

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

FanAizu 23.08.2013 20:20

Цитата:

Сообщение от bes (Сообщение 268985)
где тестовый пример с возможностью запуска?

function test()
{
	this.name = [10,12];
	this.name2 = 10;
}

var bla = new test();

function test2()
{
	this.go = function()
	{
		this.name[0] = 20;
		this.name2 = 20;
	};
}

test2.prototype = bla;

var bla2 = new test2();

alert(bla.name[0]);
alert(bla.name2);

bla2.go();

alert(bla.name[0]);
alert(bla.name2);
alert(bla2.name[0]);
alert(bla2.name2);

Яростный Меч 23.08.2013 20:29

Цитата:

Сообщение от FanAizu
если изменить значение свойства test2, то это свойство будет найдено в прототипе и изменено и при этом измененное значение будет записано в прототип объекта Б(объект А).

смотря как "изменить".
если this.name[0] = 20;, то свойство так и останется в прототипе (т.к. мы просто меняем что-то внутри него).
если this.name = [...], то новое значение свойства запишется в объект.

Яростный Меч 23.08.2013 20:35

Цитата:

Сообщение от Яростный Меч
если this.name = [...], то новое значение свойства запишется в объект.

а в прототипе останется старое, с этого момента недоступное (однако его можно вернуть, удалив новое свойство из объекта: delete this.name)

bes 23.08.2013 21:13

вызвав go в test2, начинается поиск name в test2, а так как его там нет, ищется в протитипе

function test() {
	this.name = [10,12];
	this.name2 = 10;
}
function test2() {
	this.go = function() {
		this.name[0] = 20;
		this.name2 = 20;
	};
}
var bla = new test();

var bla1 = new test2();
alert(bla1.name);

test2.prototype = bla;

var bla2 = new test2();
alert(bla2.name);


PS: возможность запуска [js run]


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