无论什么时候,我们创建的每个新的函数都会有一个prototype(原型)属性,这个属性是一个指针,会指向一个对象,即该函数的原型对象。在默认的情况下,所以的原型对象都会自动获得一个constructor属性,可以叫构造器属性,也可以叫构造函数属性,这个属性是一个指向prototype属性所在函数的指针.如下图所示:

clipboard.png

当读取某个对象的某个属性时,都会先从对象实例本身开始检索,如果没有,再到该函数的原型中去查找。
虽然我们可以通过对象实例来访问原型中的值,但是却不能通过对象实例重写原型中的值。如果在实例中,添加了一个与原型中相同名字的属性,该属性就会屏蔽掉原型中的那个属性,即使我们把这个属性设为null,也不会恢复其指向原型的连接,不过,使用delete操作符可以完全解除实例属性的屏蔽,使其重新恢复指向原型的连接。

这里用到的方法

1.构造函数名.prototype.isPrototypeOf(实例化对象名); 用来判断实例化对象里是否有指向原型对象的指针[prototype],如果有返回true;
2.Object.getPrototypeOf(); 这个方法用来返回[[prototype]]的值。例如:

alert(Object.getPrototypeOf(person1)==Person.prototype);   //true
alert(Object.getPrototypeOf(person2).name);   //"Nicholas"

3.hasOwnProperty()方法可以用来检测一个属性是否存在于实例中,还是存在于原型中。只有给定属性存在于对象实例中,才会返回true.
4.原型和in操作符
有两种方式使用in操作符,单独使用和在for-in循环中使用。单独使用时,in操作符会在通过对象能够给定属性时返回true。无论是在原型中还是实例中。


Jacen
3 声望0 粉丝

程序员,先精后广,一专多长