原型prototype

prototype:
每个函数都有一个prototype属性,所有通过相同函数创建的对象都指向同一个prototype对象。
当使用对象的属性和方法时,首先在对象内部查找,如果没有就去原型中查找
如果构造函数创建一个对象后修改构造函数的原型,之前创建的对象原型不变
如果将prototype直接替换为一个新对象,原型对象中的constructor指向会有问题,应该手动修改


constructor:
每个原型对象都有一个constructor(构造函数)属性,constructor属性指向prototype所在函数的指针


__proto__:
每个对象都有一个__proto__属性,对象通过__proto__属性可以访问原型。__proto__是一个非标准属性,低版本浏览器不支持该属性。
函数也是对象,也拥有自己的__proto__, 也就是Function.prototype, 而Function.prototype的__proto__指向了Object.prototype.
对象的__proto__属性与构造函数的prototype属性指向同一个对象

环形结构:http://www.cnblogs.com/wangfupeng1988/p/3979290.html

原型链:

 

对象实例可以访问原型中的值,但是不能修改原型中的值,如果在实例中添加一个属性。而这个属性已经包含在原型中,那我们就在实例中创建属性。
使用hasOwnProperty()函数可以查看属性是在对象中还是原型中,只有属性在对象中时才会返回true
当为对象添加一个属性时,这个属性就会屏蔽原型对象中同名的那个属性

Object.prototype成员
hasOwnProperty("propertyName"):是检测对象在排除原型链的情况下是否具有某个属性。
propertyIsEnumrable("propertyName"):检测属性是否可用for..in..枚举,有些属性是不能被枚举的,比如:toString
toString、toLocalString:转换为字符串
isPrototypeOf(obj):查看对象与原型是否有关联关系

无论属性在对象或原型中都返回true:
alert("name" in person1)

通过这个函数可以查看属性只否包含在原型中:
function hasPrototypeProperty(obj,propertyName)
{
return !obj.hasOwnProperty(propertyName) && (propertyName in obj);
}

猜你喜欢

转载自www.cnblogs.com/fanfan-90/p/11921703.html