当前位置: 代码迷 >> Web前端 >> 关于prototype跟_proto_属性
  详细解决方案

关于prototype跟_proto_属性

热度:34   发布时间:2012-08-13 13:21:53.0
关于prototype和__proto__属性

本文是为了让一些初学者在不了解的情况下能够更好的运用和使用pototype,关于原型的东西后面会讲,所以你如果不给与指点或者建议的人,请离开勿踩。

?

除了在类的构造器方法中定义属性和方法以外,我们还可以在构造器方法外使用prototype定义方法和属性。每个类都有prototype属性,该属性是一个静态属性,因此无需实例化,只需使用类引用该属性即可。

当然这里说的静态属性不是像java里面的static那样在第一次初始化后他就存在,然后每个实例调用的都是同一个那样子,换句话说,prototype的作用之一就是在构造器方法外定义方法和属性,从而使代码能够更好的复用。

下面举一个实例来说明prototy跟static是不一样的:

?

function Person(){
		this.age ;
		this.name ;	
	}
	
	function showInfo(){
		document.write("Hi,我叫 " + this.name + " ,我今年 " + this.age +" 岁啦<br>");		
	}
	
	Person.prototype.tellMeInfo = showInfo;
	var person = new Person();
	person.age = 12;
	person.name = "Cat";
	person.tellMeInfo();
	var person_2 = new Person();
	person_2.tellMeInfo();

?

?在浏览器中该程序显示结果为:

?

Hi,我叫 Cat ,我今年 12 岁啦
Hi,我叫 undefined ,我今年 undefined 岁啦
?

? ? ?每个构造器都有一个prototype属性,该属性在定义构造器方法时自动创建的,prototype属性代表用该函数创建的类的属性值,如果将方法分配给类的prototype属性,则该类的任何新创建的实例都可以使用这些方法。

? ? ? ?类的每个新实例也都有一个__proto__属性(注意前后分别是两个下划线),用于引用创建它的构造器的prototype属性。也就是说__proto__属性最终还是要经过对prototype属性的引用才能实现其功能,而且IE不支持使用__proto__属性,所以不建议使用该属性。

? ? ? ?下面是一个使用__proto__的例子():

?

function Person(myAge, myName){
	this.age = myAge;
	this.name = myName;	
}
	
function showInfo(){
	document.write("Hi,我叫 " + this.name + " ,我今年 " + this.age +" 岁啦<br>");		
}
	
var person = new Person(11, "Cat");
person.__proto__.tellMeInfo = showInfo;
person.tellMeInfo();
var person_2 = new Person(12, "Tom");
person_2.tellMeInfo();

?结果显示如下(注意IE浏览器不支持会报错):

?

Hi,我叫 Cat ,我今年 11 岁啦
Hi,我叫 Tom ,我今年 12 岁啦
?

?

  相关解决方案