关于prototype问题。

    function Parent() {
                this.a = 1;
                 this.b = [1, 2, this.a];
                 this.c = { demo: 5 };
                 this.show = function () {
                     console.log(this.a , this.b , this.c.demo );
                }
             }
             function Child() {
                this.a = 2;
                this.change = function () {
                this.b.push(this.a);
                this.a = this.b.length;
                this.c.demo = this.a++;
                 }
            }
            Child.prototype = new Parent(); 
            var parent = new Parent();
            var child1 = new Child();
            var child2 = new Child();
          
            parent.show();
            child1.show();
            child2.show();
            child1.change();

为什么运行change()的时候child1.show(),child2.show(),的数组也会改变呢(push的this.a)?谢谢!

阅读 2.5k
3 个回答
Child.prototype = new Parent(); 

这句话,使得new Child得到的对象其原型都指向于同一个new出来的Parent实例对象(我们叫他A)。

而b没有在Child中做声明,那么在Child里用b,其实就是用A的b属性,所以,你new出来的Child实例,只要一调用change方法,方法的逻辑里对b进行了数组添加操作,那就是往A的b数组里添加元素。

// 这里啰嗦一下,关于对象里访问this.xx的时候,会先查看对象当前有没有xx这个成员,没有就会往其原型对象上查找xx,这也就是为什么child实例访问this.b访问的是A的b

阅读代码中的注释部分

function Parent() {
  this.a = 1;
  this.b = [1, 2, this.a];
  this.c = { demo: 5 };
  this.show = function () {
    console.log(this.a , this.b , this.c.demo );
  } 
}
function Child() {
  this.a = 2;
  this.change = function () {

    this.b.push(this.a);
    // console.log(this.b.length);
    this.a = this.b.length;
    this.c.demo = this.a++;
  }
}
//原先的Child里有什么属性,和方法
// this.a=2;
// this.change = function () {
//     this.b.push(this.a);
//     this.a = this.b.length;
//     this.c.demo = this.a++;
// }
Child.prototype = new Parent();//现在继承了Parent
//增加了这几个属性和方法但是不是在函数内部,而是在原型上
// 分别打印console.log(Child);
//         console.log(Child.prototype);
// 你就明白了,如果你知道原型的话,这很好理解
// this.b = [1, 2, this.a]; 这个是Child实例共有的
// this.c = { demo: 5 }; 这个是Child实例共有的
// this.show = function () { 这个是Child实例共有的
//   console.log(this.a , this.b , this.c.demo );
// } 
Child.prototype.constructor=Child; 
var parent = new Parent();
var child1 = new Child();//
var child2 = new Child(); 
// parent.show();
// child1.show();
// child2.show();

// child1.change();
// child1.show();
// child2.show();

对象和普通变量是不一样的,建议先深入学习下对象

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