日期:2014-05-16 浏览次数:20491 次
一、??? Prototype:每个函数(函数也可以理解为对对象)都有一个prototype属性,是一个指向某个对象的指针,这里所说的“某个对象”是由特定类型的所有实例共享的属性和方法构成的一个对象。可以简单的理解为由构造方法创建的对象的原型对象。
二、??? 定义方式
function Person(){} Person.prototype.name = "zhangsan"; Person.prototype.age =23; Person.prototype.sayHello = function(){ return "hello,I'm zhangsan"; };?
???? 因为每个函数都有prototype属性,而prototype又是指向原型对象的一个指针,所有我们就可以采用“.”的方式去定义原型对象的属性和方法。接下来,创建Person对象的时候就可以直接调用构造函数来创建。
var person1 = new Person(); var person2 = new Person();?
?person1、person2对象都共享原型对象所有的属性和方法,我们可以从以下输出结果可以看出来:
?
alert(person1.name); //zhangsan alert(person2.name); //zhangsan alert(person1.sayHello()); //hello,I’m zhangsan alert(person2.sayHello()); //hello,I’m zhangsan?
?三、?? ?深入理解原型对象
?1.construtor:所有原型对象都有一个construtor属性,他是指向prototype 属性所在的函数的一个指针,可以用下面语句检测:
alert(??? Person.prototype.constructor == Person);//true
2.Person.prototype.constructor与Person.constructor的对比
alert( Person.prototype.constructor) // function Person() {} alert(Person.constructor); //function Function() {[native code]}?
?一个alert语句很好理解,因为在前面已经说明constructor指向的就是Person()函数,但是第二个alert显示的是Function()函数,究及原因还得从“函数与对象”的关系说起。
?
alert(typeof Person); //function alert(Person instanceof Object); //true?
?从上面两个结果可以看出,Person是一个函数,但是他可以作为对象存在,从这里我们就能很好的理解Person.constructor显示的信息为什么是“function Function() {[native code]}”了。具体可以这样去分析:
因为:function Person(){}等同于var Person = new Function(){};
?
代码的准备:
function Person(){}
var Person = new Function(){}
现在我们就开始来看图说话: Person 引用指向的是 Function 实例(即中间的矩形框,右边的椭圆只是为了说明它左边表示一个对象)
Person.constructor 可以这样去追踪 : “ Person 引用 ”—->prototype