js中的prototype属性
javascript中的每个对象都有prototype属性,Javascript中对象的prototype属性的解释是:返回对象类型原型的引用。
这个属性非常有用:为一个特定类声明通用的变量或者函数。
你不需要显式地声明一个prototype属性,因为在每一个构造函数中都有它的存在。
例如:
function cat()
{
}
alert(cat.prototype); //输出的是"Object"
由此可以看出,prototype是一个对象,那么这个对象有什么用呢
例如有一个People类:
function People(id,name)
{
this.id = id;
this.name = name;
}
People.prototype.address = "earth";
我们创建两个People对象
var people1 = new People(1,"小三");
var people2 = new People(2,"小四");
那么people1和people2的属性则为
你也可以通过prototype来给所有对象添加共用的函数。这有一个好处:你不需要每次在构造一个对象的时候创建并初始化这个函数。
例如:
function People(id, name,sex)
{
this.id=id;
this.name=name;
this.sex = sex;
}
People.prototype.getSex=function getSexFunction()
{
return this.sex;
}
People.prototype.setSex=function setSexFunction(sexValue)
{
this.sex = sexValue;
}
我们可以象通常那样创建对象:
var people1=new People(1,"Joan", "男");
var people2=new People(2,"Kim", "女");
var people3=new People(3,"Sam", "人妖");
并验证它:
alert(people1.getSex()); // 输出 "男"
alert(people2.getSex()); // 输出 "女"
alert(people3.getSex()); // 输出 "人妖"
我们也可以这样来使用prototype:
A.prototype = new B();
理解prototype不应把它和继承混淆。A的prototype为B的一个实例,可以理解A将B中的方法和属性全部克隆了一遍。A能使用B的方法和属性。这里强调的是克隆而不是继承。可以出现这种情况:A的prototype是B的实例,同时B的prototype也是A的实例。
先看一个实验的例子
function A()
{
this.show= function()
{
alert("A::show");
}
}
function B()
{
}
B.prototype = new A();
var B1 = new B();
B1 .show(); // 显示A::show
那么就会有一个问题,如果B中本身包含有一个与A的方法同名的方法会怎么样?
例子:
function A()
{
this.show= function()
{
alert("A::show");
}
}
function B()
{
this.show= function()
{
alert("B::show");
}
}
B.prototype = new A();
var B1 = new B();
B1 .show(); // 显示B::show
实验证明:函数运行时会先去本体的函数中去找,如果找到则运行,找不到则去prototype中寻找函数。或者可以理解为prototype不会克隆同名函数。
参考文章:
http://blog.csdn.net/tianyitianyi1/article/details/6929916
http://blog.sina.com.cn/s/blog_7045cb9e0100rtoh.html
http://www.cnblogs.com/yjf512/archive/2011/06/03/2071914.html