B3.3 从其他对象借函数
把函数放在第一位的状态显著改变了语言的性能,而且,对于这些改变的理解在进行GUI事件处理的时候非常重要,所以大部分Ajax程序员都要理解。
这些新的性能是什么呢?首先,一个对象可以向另一个对象借函数并且调用。我们来定义一个类来演示一个分类系统树的特殊性。
function Tree(name, leaf, bark){
this.name=name;
this.leaf=leaf;
this.bark=bark;
}
然后,添加一个提供树的简单描述的函数:
Tree.prototype.describe=function(){
return this.name+": leaf="+this.leaf+", bark="+this.bark;
}
如果我们现在建立一个树的对象,并且让它进行自我描述,我们就会得到这样的回馈:
var Beech=new Tree("green, serrated edge","smooth");
alert(Beech.describe());
弹出窗口会像这样显示:leaf=green, serrated edge,bark=smooth,就这样,下面来看看定义一个描述小狗的类:
function Dog(name,bark){
this.name=name;
this.bark=bark;
}
为我们的Dog类创建一个实例:
var Snowy=new Dog("snowy","wau! wau!");
Snowy想给我们展示它的叫声,虽然我们已经定义了,但是并没有调用的函数,然而,可以通过Tree类的函数进行:
var tmpFunc=Beech.describe;
tmpFunc.call(Snowy);
记住,function.call()的第一个参数是上下文的对象,也就是this所指的那个对象,这段代码的执行结果将是如下的一个对话框:
Snowy: leaf=undefined, bark=wau! wau!.
这对这个狗来说,是再好不过的了,那这里再进行什么呢?dog为什么可以调用tree类的函数呢?答案就是这个函数根本就不属于这个tree。即使通过这种引用把函数指定到Tree原型,只是因为他能让我们使用MyTree.describe()的简短写法。其实,函数是被存为一段文本,在我们每次调用的时候取值,这就允许this来区别这些调用。
我们可以在自己的代码里耍借用函数这个小花招,但是在正式的代码中,我们应该来实现一个Snowy自己的bark()方法。我们在这里讨论这个的真正原因是当你在写事件处理代码时,Web浏览器将在后台做一些事情。