浏览 1604 次
锁定老帖子 主题:javascript原型链体会
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-06-14
1. 每个javascript对象都有一个“原型对象”,这个对象在不同的解释器下的实现不同。比如在firefox下,每个对象都有一个隐藏的__proto__属性,这个属性就是“原型对象”的引用。以下代码在firefox下可以跑,在ie下则不行 var base = { name : "kyfxbl" }; var obj = { __proto__ : base }; alert(obj.name); 2. 当在对象上查找某属性时,会首先在此对象内查找。如果找不到,则顺着原型链自下而上在“原型对象”上查找,直到遇到“原型对象”为null,如果依然没找到,则返回undefined。 这个查找过程是解释器来保证的,所以不需要显式调用__proto__属性。比如上面的代码中,使用obj.name调用即可,不需要用obj.__proto__.name。(实际上也不可能,因为不同的浏览器,__proto__属性的名称是不同的) 3. 默认对象的“原型对象”是Object.prototype,而Object.prototype的“原型对象”则是null。也就是说 obj.__proto__ == Object.prototype;// true Object.prototype.__proto__ == null;// true 4. 但如果一个对象是通过构造器创建,则其原型对象会自动被指向构造函数的prototype属性 function Base() { this.name = "kyfxbl"; } var obj = new Base(); alert(obj.__proto__ == Base.prototype);// true 5. 所有函数的“原型对象”是Function.prototype,也就是说 function Base() { } alert(Base.__proto__ == Function.prototype);// true 6. Function.prototype有一个constructor属性,会指向自身 alert(Function.prototype.constructor == Function);// true function func() { } alert(func.__proto__.constructor == Function);// true 7. 构造函数,和构造函数.prototype是完全不同的东西 function func1() { } function func2() { } func1.name = "kyfxbl"; func2.prototype.name = "kyfxbl"; var o1 = new func1(); var o2 = new func2(); alert(o1.name);// undefined alert(o2.name);// kyfxbl 但是通过构造函数.prototype.constructor,可以引用到构造函数。 function func() { } alert(func.prototype.constructor == func);// true alert(func.constructor == func);// false alert(func.constructor == Function);// true 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |