原型的动态性

    对原型对象所做的任何修改都能立即从实例上反映出来——即使是先创建了实例后修改原型也照样如此。

         function Person(){
	 }
	 Person.prototype={
	 	name:"Nicholas",
	 	age:29,
	 	job:"Software Engineer",
	 	sayName:function(){
	 		alert(this.name);
	 	}
	 };
	 
       var friend=new Person();
      //原型的动态性
      Person.prototype.sayHi=function(){
    	  alert("hi");
      }
      friend.sayHi();//"hi"

    如代码所示,即使是在实例之后修改原型,friends仍然可以访问到该属性。实例与原型之间的连接只不过是一个指针,而非一个副本。尽管可以随时为原型添加属性和方法,但如果重写原型,那么情况会有所不同。重写原型对象切断了现有原型与任何之前已经存在的对象实例的联系;它们引用的仍然是最初的原型。

          function Person(){
	 }
	  var friend=new Person();
	  Person.prototype={
	 	name:"Greg",
	 	age:29,
	 	job:"Software Engineer",
	 	sayName:function(){
	 		alert(this.name);
	 	}
	 };
	 friend.sayName();//error

    此时返回错误,因为此时原来的原型里面没有sayName属性。同理,下面的例子讲返回“Nicholas”。

          function Person(){
	 }
	 Person.prototype={
	 	name:"Nicholas",
	 	age:29,
	 	job:"Software Engineer",
	 	sayName:function(){
	 		alert(this.name);
	 	}
	 };
	  var friend=new Person();
	  
	  Person.prototype={
	 	name:"Greg",
	 	age:29,
	 	job:"Software Engineer",
	 	sayName:function(){
	 		alert(this.name);
	 	}
	 };

	 friend.sayName();//Nicholas
    小结:可以修改原型属性和方法,无论是在对象实例的前后。但不可以重写原型,此时对象实例仍然指针指向原来的原型,即创建的原型一定要在对象实例之前才会起作用。如果创建的两个原型都在对象实例之前,后面的一个会起作用。

 

         function Person(){
	 }

        Person.prototype={
	 	name:"Nicholas",
	 	age:29,
	 	job:"Software Engineer",
	 	sayName:function(){
	 		alert(this.name);
	 	}
	 };

	 Person.prototype={
	 	name:"Greg",
	 	age:29,
	 	job:"Software Engineer",
	 	sayName:function(){
	 		alert(this.name);
	 	}
	 };
	  var friend=new Person();
	  
	 friend.sayName();//Greg
大笑 问题有想法欢迎交流,共同进步!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值