可以简单认为,JavaScript中所有的"东西"都是对象,而Function和Object是JavaScript的两个基本的核心对象.
显然,这种说法过于笼统,可以把JavaScript中的对象,分为两种:
一种是"函数对象"(function),是可以再实例化对象的.所有由function关键字创建的"对象"都是"函数对象",它其实就是JavaScript的"类";
一种是"实例对象"(object),是不可创建对象的对象.所有由"函数对象"进行实例化操作创建的对象就是"实例对象",它是一般意义上的OO语言中的"对象".
下面举一个区分这两种"对象"的示例,代码如下:
<script type="text/javascript">
//创建function函数对象
var f = function(){
}
f.prototype.show = function(str){
alert(str);
}
//由函数对象创建实例对象
var a = new f();
a.show("kao");
//var b = new a(); //不能由实例对象创建实例对象.
//分别显示函数对象与实例对象的"对象类型"
alert(typeof(f)); //function
alert(typeof(a)); //object
//可见,函数对象的类型是function;而实例对象的类型是object
</script>
明白JavaScript中"函数对象"与"实例对象"的不同之后,来看一下上述js代码的一个小地方:prototype.
prototype原型对象在JavaScript中是一个核心对象,相当关键和重要.这里它被用来定义"类"f的一个方法:show.如果没有"f.prototype.show"这行代码,那么f不过是一个常规的函数,而加了这么一行代码后,可以认为,类f定义了一个常规方法:show.
和其他面向对象语法的编程模型一样,类的常规方法是可以给它实例化的对象的,因此当实例化对象a之后,a可以直接使用"a.show"来调用方法show.
Function是所有function对象的"基类",就是说Function的所有属性和方法,function类型的对象都可以直接拥有.
为了说明这一点,请参阅如下代码,并运行之.
<script type="text/javascript">
Function.prototype.display = function(str){
alert("Function:"+str);
}
var f = function(){
}
f.prototype.show = function(str){
alert(str);
}
f.display("f"); //这里,f作为一个对象,调用Function定义的方法display
var a = new f();
//a.display("x"); //这里会出错
a.show("x");
</script>
Function是f的基类,而a是f的对象实例,这里a.display应该能调用,但是实际中会出错. 需要指明一点:function从Function的prototype继承的属性和方法,都自动成为了静态方法,而类的静态方法,该类的实例对象是无法直接调用的.因此,a.display会出错.
Object是所有对象的"基类",它的范围更广,不管是function对象还是object对象,都可以直接具有Object对象的常规属性和方法.如下所示:
<script type="text/javascript">
Object.prototype.display = function(str){
alert("Object:"+str);
}
var f = function(){
}
// f.prototype.display = function(str){
// alert("function:"+str);
// }
f.display("f");
var a = new f();
a.display("a");
</script>
通过上面的阐述,我想说明的是由Function和Object定义的常规属性和方法(不是静态的),会自动使相应类型的对象具备.不仅Function和Object两个对象如此,如Array,String,Date,Error等也具有相同的特性.如下是扩展Array的clear方法的一个示例:
<script type="text/javascript">
Array.prototype.clear = function() {
if (this.length > 0) {
this.splice(0, this.length);
}
}
var as = new Array();
as.push(1);
as.push(3);
alert(as.length);
as.clear();
alert(as.length);
</script>
JavaScript内置的Array对象是没有clear方法的,这里我们为Array扩展了一个clear方法,用来清空数组对象内的所有元素.
需要一提的是,并不是所有系统"类"的扩展都能为对象所具备,静态属性和方法就只能有"类"使用,而不能由对象使用,如下所示:
<script type="text/javascript">
Object.typeName = "Object"; //静态属性
Object.display = function(str){ //静态方法
alert(str);
}
Object.prototype.show = function(str){ //常规方法
alert(str);
}
var a = new Object();
//a.display(a.typeName); //实例对象使用类的静态属性和静态方法将会出错
a.show("kao"); //使用类的常规方法就没事啦.
</script>
Atlas正是通过这种JavaScript特性,扩展了JavaScript的很多属性和方法.下一节正式进入Atlas源码分析.