javaScript中的原型解析【推荐】(2)

时间: 作者:所支
  
  

上面这段代码可见,即使对原型对象属性的修改发生在实例创建的后面,boy实例亦然共享了Person.prototype.hobby.

  

  

但是,这种情况仅仅发生在原型对象属型的修改,当对原型对象属性进行完全重写时,实例的创建必须放在原型对象属性重写的后面,否则会出错。

  
  

  
  
  function Person(){}  var girl=new Person();  Person.prototype={  first_name:"guo",  hair_color:"black",  city:"zhengzhou",  act:function(){alert("eatting");}  };  var boy=new Person();  Person.prototype.hobby="basketball";  alert(boy.hobby);  //basketball  alert(girl.first_name);  //undefined  
  
  

再回到“屏蔽”这一问题上,我们前面了解到了创建实例对象的属性(与原型对象中的某一属性重名)会屏蔽掉原型对象的该属性,但不影响其他实例对象。这里有一个错误,这个情况只适用于基本数据类型,当属性的值引用类型时,会出现一个大问题,看如下代码。

  

  
  
  function Person(){}  Person.prototype={  first_name:"guo",  hair_color:"black",  friends:["Nick","John"],  city:"zhengzhou",  act:function(){alert("eatting");}  };  var boy=new Person();  boy.friends.push("Mike");  var girl=new Person();  alert(boy.friends);  //Nick,John,Mike  alert(girl.friends); //Nick,John,MIke
  
  

可见,上面这句话不适用了,原因是friends是存在于原型对象中的,而不是boy中,所以他的修改会影响到这个环境。(我们可以通过boy.frindes=[]来创建一个boy实例的属性)那么,我们就需要引入组合使用构造函数模式与原型模式。

  

  
  
  function Person(hair_color,city){  this.hair_color=hair_color;  this.city=city;  this.friends=["John","Nick"];  }  Person.prototype={  constructor:Person,  first_name:"guo",  act:function() {  alert("eatting");  }  };  var boy=new Person("black","zhengzhou");  var girl=new Person("red","shenyang");  boy.friends.push("Nick");  alert(girl.friends);  alert(boy.friends);  
  
  

该模式是目前ECMAScript中使用最广泛,认同最高的创建自定义类型的方法,甚至可以作为一种默认模式。

  

  

但是对于从事其他面向对象语言的程序员来说,这样的模式显得很怪异,为了将所有的信息都封装到构造函数中,动态原型模式出现了。动态模式主要是通过一个if语句来判断是否需要对原型对象进行初始化,以达到节省资源的目的。

  

  

此外还有稳妥构造模式,是为了适应没有共享属性和不使用this的情况。

  

  

以上这篇javaScript中的原型解析【推荐】就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

  

(责任编辑:admin)

推荐图片Related

相关文章Related

查看更多热门新闻


首页 | js代码 | jQuery特效 | 其他代码 | 关于我们

Copyright © 2010-2019 菲娱国际平台 版权所有

系统要求:本站自适应各终端浏览器分辨率

请使用Google、Firefox、IE9、百度浏览器登录网站

网站地图 | RSS订阅 | 菲娱国际平台