草稿

  原型虽然在某种程度上带来很大方便,但也存在一些问题,其问题是由它共享的本质所导致的。

  我们知道,原型中的属性是可以被实例共享的,这种共享对于函数非常合适不过,但对于属性就要另当别论了。如果如果属性的值为基本类型数据,其共享的特点也能说得过去,而属性的值为引用数据类型时,问题就很明显,比如下面的例子。

  function P(){

  };

  P.prototype={

    name:“张三”;

    friends:["Tom","Jerry"]

  };

  var p1 = new P();

  var p2 = new P();

  p1.name = "李四"

  p1.friends.push("Mike");

  alert(p1.name);     //"李四"

  alert(p1.name);     //"张三"

  alert(p1.friends);    //["Tom","Jerry","Mike"]

  alert(p2.friends);    //["Tom","Jerry","Mike"]

  在此例中,构造函数P的原型中有一个friends属性,指向一个叫["Tom","Jerry"]的数组。接着创建了p1和p2两个实例,然后修改p1的friends属性,给数组添加了一成员“Mike”,由于数组存在P.prototype当中,而不是p1中,

 ····待续

原文地址:https://www.cnblogs.com/onedayzq/p/5801283.html