Наследование прототипов JavaScript: почему вызов метода getter/setter потомка влияет на родителя?
Пожалуйста, смотрите скрипту / код ниже: http://jsfiddle.net/kmiklas/3YdTA/4/
Вопросы:
- Почему вызов функции сеттера ребенка - в примере, вызов
Object.create(99)
- изменить настройки родителя? Обратите внимание, что, хотя мы вызвали эту функцию в контексте оранжевого, она также меняет значение для красного. - Что еще более важно, как унаследованные функции получения / установки могут применяться к дочернему элементу, а не к родительскому элементу?
- Что мне здесь не хватает?
var Square = function () {
var side;
this.setSide = function(s) {
side = s
}
this.getSide = function() {
return side;
}
}
var red = new Square();
var orange = Object.create(red);
red.setSide(100);
var $container = $('#container');
$container.append('orange.getSide(): ' + orange.getSide() + '<br>');
$container.append('red.getSide(): ' + red.getSide() + '</br><br>');
$container.append('<i>Now we call orange.setSide(99)...</i><br></br>');
orange.setSide(99);
$container.append('orange.getSide(): ' + orange.getSide() + ' <i>...as expected.<br></i>');
$container.append('red.getSide(): ' + red.getSide() + '!? <i>Why does the call to orange.setSide(99) affect the side length of the parent?</i></br>');
1 ответ
Решение
The Object.create() method creates a new object with the specified prototype object and properties.
var orange = Object.create(red);
Вы не клонируете объект таким образом, вы создаете новую ссылку на него, поэтому любые изменения, которые вы вносите в исходный объект, будут влиять на все копии этого объекта.
var x = {name:"foo",phone:"bar"};
var y = Object.create(x);
x.u = "123";
console.log(y);//{name: "foo", phone: "bar", u: "123"}
console.log(x);//{name: "foo", phone: "bar", u: "123"}
объект копируется Ref
в javaScript
см. это на Как правильно клонировать объект JavaScript?