JavaScript 原型链变化,为什么导致变量跟着变化?

不知为啥,当代码执行了倒数第二行 C.prototype = b; 之后,变量 b 的值也随之改变了,第一次输出 B {y: 2},第二次输出 A {y: 2},请 JavaScript 大牛帮忙解答一下。代码如下:

(function() {

  function A(x) {
    this.x = x;
  }

  function B(y) {
    this.y = y;
  }

  function C(z) {
    this.z = z;
  }

  var a = new A(1);
  B.prototype = a;

  var b = new B(2);
  console.log(b);    // B {y: 2}

  C.prototype = b;   
  console.log(b);    // A {y: 2}

}());

下图为 Chrome 控制台调试过程:

clipboard.png

原问题为:请问chrome中console.log打印的对象名是指向哪里?

阅读 3.7k
3 个回答

感觉像 chrome的bug Safari没有这个问题

b并没有变

(function() {

  function A(x) {
    this.x = x;
  }

  function B(y) {
    this.y = y;
  }

  function C(z) {
    this.z = z;
  }

  var a = new A(1);
  B.prototype = a;
  //B.prototype.constructor = B; 重置constructor就可以了

  var b = new B(2);
  console.log(b);    // B {y: 2}
  
  var c = b;

  C.prototype = b;   
  
  console.log(b);    // A {y: 2}
  console.log(c === b) // true

}());

这牵扯到原型的继承,在原型链上就是这样继承的,这是为了让对象可以通过原型链继承相同的属性,javascript在原有的继承上又引入构造函数可以一起使用,可以解决此类问题,另外java增添了类继承,其实就是给javascrippt的一个语法糖,他本质就是构造函数和原型继承的结合。
建议可以找本书看看有关原型继承的例子。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏