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

JavaScript类继承机制
            JavaScript所有对象都继承自Object类。
            属性
            constructor属性 从javascript1.1开始,每个对象都有这个属性,它指向用来初始化改对象的构造。
<script type="text/javascript">
	var testFun = function () {					
		var obj = new Object();
		var str = "";
		str += "\r\nconstructor : ";
		str += obj.constructor;	
		str += "\r\ntypeof obj.constructor : ";
		str += typeof(obj.constructor);
		alert(str);
		/**
			constructor : function Object() {
				[native code]
			}
			//Object内部实现是函数
			typeof obj.constructor : function
		*/
	}
</script>

            javascript内部实现了很多函数,如Object,Date都是函数由Function得到的。
            prototype属性 对该对象的对象原型的引用。对于所有的类,它默认返回Object对象的一个实例。
<script type="text/javascript">
	function testFun () {
		 function foo(a, b, c) {
			return a * b * c;
		}
		var str = "";
		str += "foo params length : " + foo.length;			
		str += "\r\ntypeof foo.constructor : " + (typeof foo.constructor);		
		str += "\r\ntypeof foo.call : " + (typeof foo.call);		
		str += "\r\ntypeof foo.apply : " + (typeof foo.apply);		
		str += "\r\ntypeof foo.prototype : " + (typeof foo.prototype);	
		str += "\r\ntypeof Object.prototype : " + (typeof Object.prototype);
		alert(str);	
		/**
			foo params length : 3
			typeof foo.constructor : function
			typeof foo.call : function
			typeof foo.apply : function
			typeof foo.prototype : object
			typeof Object.prototype : object
		*/
	}
</script>	

            JavaScript中的每个对象都会包含另一个对象的引用,这个引用对应的对象被称为前面那个对象的原型(prototype)。
            比如A对象包含了对B对象的引用(B0),B0对应的对象B称为对象A的原型。
            由于原型本身也是一个对象,因此它也会包含对它的原型的引用。这样就形成了一条对象链,这条链终止于内建的Object类的原型(Object.prototype),然而却不能像访问普通属性那样直接访问某个对象的原型。
            当要读取某个对象的属性时,JavaScript将会在该对象中寻找这个属性。如果没有找到,JavaScript就会在该对象的原型中继续寻找,如果还找不到,就继续找原型的原型,依次进行下去,直到找到这个属性或者已经找到了这条链的尽头。
            JavaScript为每一个类型(Type--Object是一个类型,new Object()定义了一个对象)都提供了一个prototype属性,将这个属性指向一个对象,这个对象就成为了这个类型的“原型”,这意味着由这个类型所创建的所有对象都具有这个原型的特性。
            另外,JavaScript的对象是动态的,原型也不例外,给prototype增加或者减少属性,将改变这个类型的原型,这种改变将直接作用到由这个原型创建的所有对象上。当创建一个对象时,它的原型引用也就设置好了,而且在这个对象的生命周期内,这个引用都不会再更改。
            原型与类型的关系要求一个类型在一个时刻只能有一个原型。对于JavaScript来说,这个限制有两层含义,第一是每个具体的JavaScript类型有且仅有一个原型(prototype),在默认的情况下,这个原型是一个Object对象(注意不是Object类型)。第二是,这个对象所属的类型,必须是满足原型关系的类型链。
            由于在JavaScript中有两种创建对象的方法,所以也有两种设置对象的原型引用的方法。首先,每个由对象常量创建的对象都会将其原型引用指向内建类型Object的Object对象。
var obj1 = {};
var obj2 = {};
var obj3 = new Object();
//obj1、obj2、obj3具有相同的原型对象

            第二种情况下,每个由关键字new加上构造函数而创建的对象,同时将构造函数的prototype对象指派给新创建的对象,成为该对象内置的原型对象。
var p = {};
function SomeConstructor () {
//......
}
SomeConstructor.prototype = p;
SomeConstructor.prototype.constructor = SomeConstructor;
alert(p.constructor);
var obj1 = new SomeConstructor();
var obj2 = new SomeConstructor();
//obj1、obj2具有相同原型对象p
//p的原型引用指向内置对象Object的