标题:ECMAScript 3rd阅读笔记之二——js中的晚绑定和极晚绑定
取消只看楼主
渚薰
Rank: 6Rank: 6
等 级:贵宾
威 望:22
帖 子:1132
专家分:0
注 册:2006-8-6
 问题点数:0 回复次数:0 
ECMAScript 3rd阅读笔记之二——js中的晚绑定和极晚绑定
js中的晚绑定和大多数语言(比如c++)中的晚绑定概念一样,简单的说,就是动态地引用不同的实例的同名方法(或属性),例如代码:

  1. window.a=function() {};
  2. a.prototype.method=function() {alert(’a');};window.b=function() {};
  3. b.prototype.method=function() {alert(’b');};c=new window[prompt('’)];
  4. alert(c.method());

当运行时,用户在输入框里输入a,那么最后提示的就是a,而输入b,提示的就是b,这就是晚绑定。

而js中,还有一种叫做“极晚绑定” ,很少语言有支持极晚绑定。而js得prototype链机制,导致了js支持极晚绑定。示例代码如下:

  1. var a=function() {};
  2. a.prototype.p1=1;
  3. var b=new a();
  4. alert(b.p1);
  5. alert(b.p2);
  6. a.prototype.p2=2;
  7. 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编辑过]

搜索更多相关主题的帖子: js中 绑定 ECMAScript 笔记 class 
2007-11-16 17:51



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-186552-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.703822 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved