JavaScript 原型(prototype)继承 : Why does call to getter/setter of child affect parent?

标签 javascript inheritance prototypal

请看下面的 fiddle /代码: http://jsfiddle.net/kmiklas/3YdTA/4/

问题:

  • 为什么调用子项的 setter 函数——在本例中,调用 Object.create(99)——会更改父项的设置?请注意,虽然我们在 orange 的上下文中调用了此函数,但它也会更改 red 的值。
  • 更重要的是,如何将继承的 getter/setter 函数应用于子项而不是父项?
  • 我在这里缺少什么?

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>');

最佳答案

Object.create() 方法使用指定的原型(prototype)对象和属性创建一个新对象。

MDN

 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"} 

对象在 javaScript 中被 Ref 复制

DEMO

How do I correctly clone a JavaScript object? 上看到这个

关于JavaScript 原型(prototype)继承 : Why does call to getter/setter of child affect parent?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21266667/

相关文章:

javascript - 在 AngularJS 中执行 $http.post 查询后返回 2 个表

c++ - 如何检测和断言特定类的虚拟继承?

c++ - 如何禁止 C++ 派生类从基类派生,但允许从另一个派生类派生

python - 在 python 中加载模块范围的配置

javascript - 适当的原型(prototype)继承

javascript - 如何仅传递非空变量作为函数参数?

javascript - 处理未知数量的表单值

javascript - 为什么 Angularjs responseError 拦截器返回状态码 -1