Вопрос наследования Javascript - PullRequest
2 голосов
/ 10 ноября 2011

Судя по количеству вопросов о "наследовании javascript", я собираюсь предположить, что на мой вопрос, вероятно, уже был дан ответ в другом месте, и я просто не понимаю другие решения ... или, очевидно, javascript в целом.

Мой вопрос таков: почему код ниже (http://jsfiddle.net/Se9ZW/2/) печатает «test5» вместо «test1»?

var fake = { value:'test1'};
var fake2=fake;
fake2.value='test5';
document.getElementById('debug').innerHTML=fake.value;

Это кажется чем-то довольно очевидными поэтому мне даже стыдно рассказывать об этом, но я думаю, тебе нужно как-то учиться.

Ответы [ 4 ]

4 голосов
/ 10 ноября 2011

fake и fake2 являются ссылками на один и тот же объект, поэтому вполне ожидаемо, что они ведут себя таким образом. Это не имеет ничего общего с наследованием.

Теперь, если вы хотите наследовать, один из способов (весьма наивно, я бы добавил) мог бы сделать это так:

var fake = { value:'test1'};
var fake2 = Object.create(fake); //creates a new object with fake as prototype
fake2.value = 'test5'; // "overrides" the value property from the prototype
console.log(fake.value);

, и тогда результат будет:

test1

Обратите внимание, что это из ECMAScript Edition 5 - который довольно недавний и может работать не во всех реализациях движка JavaScript.

Существует несколько способов реализовать / использовать наследование в JavaScript.Я собираюсь отослать вас к одному из объяснений в принятом ответе здесь .

1 голос
/ 10 ноября 2011

Может быть, вы запутались в терминологии?Вот объяснение без слов «ссылка» и «значение»:

{ value:'test1'} - это Объект.Вы можете думать об этом как о ведре, полном вещей.В этом случае в контейнере есть одна вещь с именем value.

В строке 1 вы указываете фальшивку на ведро.В строке 2 вы указываете fake2 на fake.Поскольку fake просто указывает на корзину, fake2 также указывает на точно такую ​​же корзину.

В строке 3 fake2.value - это элемент с именем value в корзине.fake2.value - это то же самое в том же ведре.

Другой способ сказать то же самое - это то, что примитивы (например, конкретные вещи) передаются по значению, а объекты (например, контейнеры и / или контейнеры)передаются по ссылке в JavaScript.

1 голос
/ 10 ноября 2011

Это потому что

var fake2 = fake;

создает ссылку на fake в fake2. Если вы что-то измените в fake2, то и fake также будет изменен.

0 голосов
/ 10 ноября 2011

Поскольку javascript передается по ссылке, то есть fake2 - это не копия fake, это другое имя fake и фактически тот же объект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...