function Person(name,age){ this.name=name; this.age=age; } Person.prototype.sayName=function(){ alert(this.name); } var p1=new Person("Lily",24); alert(p1.__proto__.sayName); //function (){alert(this.name);} alert(p1.__proto__.constructor==Person); //true
在ECMAscript5中新增了一个方法,Object.getPrototypeOf(),可以返回前面提到的实例对象内部的指向其原型的指针的值:
function Person(name,age){ this.name=name; this.age=age; } var p1=new Person("Lily",24); alert(Object.getPrototypeOf(p1)==Person.prototype); //true
isPrototypeOf()方法也可用于确定实例对象和其原型之间的这种关系:
function Person(name,age){ this.name=name; this.age=age; } var p1=new Person("Lily",24); alert(Person.prototype.isPrototypeOf(p1)); //true
原型语法
从前面介绍原型对象于实例对象及构造函数的关系中,我们已经知道,给原型对象添加属性和方法只要像这样定义即可:Person.prototype=name。
那么是否每定义一个Person的属性,就要敲一遍Person.prototype呢?答案是否定的,我们也可以像用对象字面量创建对象那样来创建原型对象:
function Person(){ } Person.prototype={ name:"Tom", age:29 } var p1=new Person(); alert(p1.name); //Tom alert(p1.age); //29
有一点要注意,这个方法相当于重写了整个原型对象,因此切断了它与构造函数的关系,此时Person.prototype.constructor不再指向Person:
function Person(){ } Person.prototype={ name:"Tom", age:29 } var p1=new Person(); alert(Person.prototype.constructor==Person); //false alert(Person.prototype.constructor==Object); //true
因此,如果想要让它重新指向Person,可以显示的进行赋值:
function Person(){ } Person.prototype={ constructor:Person, name:"Tom", age:29 } var p1=new Person(); alert(Person.prototype.constructor==Person); //true alert(Person.prototype.constructor==Object); //false
总结
最后,我们拿一个例子,再来理理构造函数、原型对象以及实例对象之间的关系:
function Person(name,age){ this.name=name; this.age=age; } Person.prototype.sayName=function(){ alert(this.name); } var p1=new Person("Tom",20); alert(Person.prototype); //object alert(Person.prototype.constructor==Person); //true alert(p1.constructor==Person); //true alert(p1.__proto__==Person.prototype); //true alert(p1.__proto__.__proto__==Object.prototype); //true alert(p1.__proto__.__proto__.constructor==Object); //true alert(Person.constructor==Function); //true alert(Object.prototype.constructor==Object);
上图说明了这个例子中原型、构造函数和实例属性的关系。
更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《javascript面向对象入门教程》、《JavaScript常用函数技巧汇总》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》