Наследование JavaScript: переменная массива Parent сохраняет значение

Я пытаюсь использовать здесь наследование в JavaScript и обнаружил проблему со значением массива в классе Parent, которое наследуется класс Дочерний. Код ниже представляет собой обычное наследование:

var Parent = function() {
    this.list = [];
};

var Child = function() {};

Child.prototype = new Parent;
Child.prototype.constructor = Child;

var obj1 = new Child;

obj1.list.push("hello");

console.log(obj1.list); // prints ["hello"];

Когда я инициализировал новый объект Child (наследует Parent, который содержит переменную массива с именем list) в obj1 и попытался нажать obj1.list со значением "привет", obj1.list печатает ["привет"] .. пока все хорошо.

Проблема возникает, когда я сделал приведенный выше пример и попытался инициализировать новый объект Child в obj2, а затем нажать obj2 в список со значением "до свидания", а obj2.list теперь печатает ["привет", "до свидания"]. (См. код ниже:)

var obj2 = new Child;

obj2.list.push("goodbye");

console.log(obj2.list); // prints ["hello", "goodbye"];

Возможно, у меня неправильное представление, но массив list в Parent каким-то образом сохраняет значение, и я не знаю почему.

Это большая проблема, потому что если я повторно использую класс Parent для многих других дочерних классов, как в случае выше, если Parent имеет переменную массива, общую для его дочерних классов, значение будет передан и другим дочерним классам, что для меня неожиданно.

Я ожидал, что класс Child представляет новый объект, то же самое относится к классу Parent, когда класс Child инициализируется как obj1. ], который затем, когда я инициализирую новый объект Child в obj2, переданное значение из obj1 не должно использоваться совместно с obj2.

-- Вопрос --

Может ли кто-нибудь помочь мне выяснить, почему list (переменная массива Parent) в приведенном выше примере сохраняет значения/разделяет значения которые инициируются дочерними объектами (в приведенном выше случае obj1 и obj2)?

Если у вас есть другое решение, которое может решить эту проблему, это будет очень мило с вашей стороны. , но я буду рад сначала выяснить проблему выше.

8
задан 16 February 2012 в 12:10
поделиться