ECMAScript 3rd阅读笔记之二——js中的晚绑定和极晚绑定
js中的晚绑定和大多数语言(比如c++)中的晚绑定概念一样,简单的说,就是动态地引用不同的实例的同名方法(或属性),例如代码:
- window.a=function() {};
- a.prototype.method=function() {alert(’a');};window.b=function() {};
- b.prototype.method=function() {alert(’b');};c=new window[prompt('’)];
- alert(c.method());
当运行时,用户在输入框里输入a,那么最后提示的就是a,而输入b,提示的就是b,这就是晚绑定。
而js中,还有一种叫做“极晚绑定” ,很少语言有支持极晚绑定。而js得prototype链机制,导致了js支持极晚绑定。示例代码如下:
- var a=function() {};
- a.prototype.p1=1;
- var b=new a();
- alert(b.p1);
- alert(b.p2);
- a.prototype.p2=2;
- alert(b.p2);
b初始化a的一个实例,此时输出b.p1,根据prototype链接,结果是1。而第一次输出b.p2时,显示的undefined。然后,再设置a.prototype.p2=2,此时在输出b.p2,显示的是2。所有这些就是prototype链在作怪。因为,访问b.p1和b.p2都不是真正访问对象b中的p1属性和p2属性(因为没有语句采取b.p1=xx;b.p2=xx;来设置的对象b的属性),访问的都是b对象沿着prototype链上的p1和p2属性,即都是a.prototype.p1和a.prototype.p2,所以在b初始化后,再设置a.prototype.p2,就使得能够通过b.p2来访问p2属性。(如果读者不理解这里的prototype链机制,请参看另一篇文章《ECMAScript 3rd阅读笔记之一–js prototype链解惑》)。
[此贴子已经被作者于2007-11-19 9:55:35编辑过]