日期:2014-05-16  浏览次数:20314 次

javascript原型链体会
总结javascript原型链的概念

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