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

JavaScript中prototype/constructor的理解

一,prototype(对象)(原型链)

可使javascript拥有

1,重写

2,添加方法

3,继承的机制

?

prototype继承原理:

每一个方法的创建,都有着一个单例的对象functionName.prototype, 在使用这个方法创建的每一个对象,该prototype都会赋值给他,(prototype里面包含了一些属性,方法包含construtor)

也正因为每个对象都共享一个prototype,所以可以操作这个prototype,

1,将你类对象赋给他达到继承的目的,看下面文章

2,可在该prototype上,重写方法,或者添加方法

?

1,重写

如:Array.prototype.push=function(){
	//execute your's function
}

2,添加方法

Array.prototype.newMethod=function(){
	//add new method for after use
}

3,继承

//---------------下面实例实现

?

4,prototype的了解.

function F1(){
}

F1.prototype.run=function(){
	alert("execute run.f1 method");
}

var a1=new F1();
var a2=new F1();
if(a1.run()===a2.run());//推出prototype是单例的对象,每一个对象的创建prototype相同

?

二,?constructor(方法):说明本身是由怎么构造而成的

var arrayObject=new Array();
arrayObject.constructor;//Array
Array.constructor;//Function
Object.constructor;//Function   Object.prototype为null
Function.constructor;//Function(最高级别即本身)

??可跟prototype应用操作:

如arrayObject.construcotr.addmethod=function(){}可这样为Array提供方法

?

使用prototype与constructor进行完整的继承封装

//为了达到封装的完善性,引申以下问题
//引申问题一,保证使每一个对象object.construcotr能够找到自己(function)
//引申问题二,保证使之通过suberObject能找到父类

//问题一例子
function Parent(){
	this.log=function(){
		document.writeln("this is parent log.....<br>");
	}
}
function Suber(){
	this.log=function(){
		document.writeln("this is suber log......<br>");
	}
}

var suber1=new Suber();
//可得到子类本身
document.writeln(suber1.constructor);
//故当其中有一个被改变时,另一个也会被改变.construcotr是相应的prototype中的一个属性,以下访问是同一个属性
document.writeln(suber1.constructor===Suber.prototype.constructor);
document.writeln("<br>--------------------------------------------<br>");


//当继承时.....
Suber.prototype=new Parent();
var suber2=new Suber();
//得到的是父类本身,丢失了自己的构造函数,故"问题一"出现
document.writeln(suber2.constructor);
document.writeln("<br>--------------------------------------------<br>");


//解决"问题一"方法
Suber.prototype=new Parent();
Suber.prototype.constructor=Suber;
var suber3=new Suber();
document.writeln(suber3.constructor);
document.writeln("<br>--------------------------------------------<br>");


//这样一来,引申出"问题二",我们获取不到parent的本身方法
//故只能采用定义一个属性的方式来存储父类
//解决"问题二"方法
Suber.prototype=new Parent();
Suber.superClass=Parent;//每一级别都设置该属性进行存储父类方法
Suber.prototype.constructor=Suber;
var suber4=new Suber();
document.writeln(suber4.constructor);
document.writeln("<br>--------------------------------------------<br>");
document.writeln(Suber.superClass);
?

//可参考extjs中的继承封装....

?

参考文章:http://hi.baidu.com/maxwin2008/blog/item/8da86102c1ceda034bfb51a3.html