<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: Crockford uber方法中的陷阱</title>
	<atom:link href="http://lifesinger.org/blog/2008/10/bug-in-crockford-uber-function/feed/" rel="self" type="application/rss+xml" />
	<link>http://lifesinger.org/blog/2008/10/bug-in-crockford-uber-function/</link>
	<description>关注用户体验、前端开发，记录生活点滴、岁月足迹。</description>
	<lastBuildDate>Wed, 08 Sep 2010 15:14:32 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
	<item>
		<title>By: lifesinger</title>
		<link>http://lifesinger.org/blog/2008/10/bug-in-crockford-uber-function/comment-page-1/#comment-3588</link>
		<dc:creator>lifesinger</dc:creator>
		<pubDate>Tue, 08 Dec 2009 07:41:55 +0000</pubDate>
		<guid isPermaLink="false">http://lifesinger.org/blog/?p=192#comment-3588</guid>
		<description>@约翰：发过邮件给 DC, 不过没有任何回复。可能太忙了。</description>
		<content:encoded><![CDATA[<p>@约翰：发过邮件给 DC, 不过没有任何回复。可能太忙了。</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: 约翰</title>
		<link>http://lifesinger.org/blog/2008/10/bug-in-crockford-uber-function/comment-page-1/#comment-3584</link>
		<dc:creator>约翰</dc:creator>
		<pubDate>Tue, 08 Dec 2009 04:17:45 +0000</pubDate>
		<guid isPermaLink="false">http://lifesinger.org/blog/?p=192#comment-3584</guid>
		<description>谢谢lifesinger的确认，不知道你是否把你的发现和解决方法告知DC？</description>
		<content:encoded><![CDATA[<p>谢谢lifesinger的确认，不知道你是否把你的发现和解决方法告知DC？</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: lifesinger</title>
		<link>http://lifesinger.org/blog/2008/10/bug-in-crockford-uber-function/comment-page-1/#comment-3582</link>
		<dc:creator>lifesinger</dc:creator>
		<pubDate>Tue, 08 Dec 2009 02:51:04 +0000</pubDate>
		<guid isPermaLink="false">http://lifesinger.org/blog/?p=192#comment-3582</guid>
		<description>@约翰：感谢你的整理。uber 的 bug, chensheng 发现了一个，hax 给出了解决办法。我这里是 uber 的另一个隐晦 bug, 也给出了解决办法。

这个方法，是有传统 OO 思想的程序员情节，对于 JS 本身来说，uber 没啥用。这也就是为何 DC 说 8 年没用一次的原因。

JS 有更简洁方便继承体系，《JavaScript: The Good Parts》中的 inherits 是一种。</description>
		<content:encoded><![CDATA[<p>@约翰：感谢你的整理。uber 的 bug, chensheng 发现了一个，hax 给出了解决办法。我这里是 uber 的另一个隐晦 bug, 也给出了解决办法。</p>
<p>这个方法，是有传统 OO 思想的程序员情节，对于 JS 本身来说，uber 没啥用。这也就是为何 DC 说 8 年没用一次的原因。</p>
<p>JS 有更简洁方便继承体系，《JavaScript: The Good Parts》中的 inherits 是一种。</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: 约翰</title>
		<link>http://lifesinger.org/blog/2008/10/bug-in-crockford-uber-function/comment-page-1/#comment-3580</link>
		<dc:creator>约翰</dc:creator>
		<pubDate>Tue, 08 Dec 2009 02:10:46 +0000</pubDate>
		<guid isPermaLink="false">http://lifesinger.org/blog/?p=192#comment-3580</guid>
		<description>让我来把这整个故事整理一下，如果有问题，请大家指正和补充。
跟这个故事有关的人物：
1. Douglas Crockford (DC)
2. chensheng
3. John Hax 贺师俊
4. lifesinger 射雕

首先是DC在他的网站上发表了一篇有关Javascript继承文章: Classical Inheritance in JavaScript，其中提出了inherits方法，这个方法实现很复杂，其中有包含有uber方法；
结果chensheng发现了其中关于uber方法的一个错误，发表在CSDN上，时间是2006年12月28日；
John Hax 与2006年12月31日在CSDN上连续发表评论，并且给出修正方法，同时还在在英文网站上给出修正；
DC不知何时（估计是2007年）看到了John Hax的文章，并且修改了最初的文章，完全采用了Hax的修正（但是没有任何感谢Hax的表示，这让Hax很不高兴），DC同时在他的文章最后补充说：他写了8年的Javascript，从来没有用过uber方法，（这是否意味着uber方法没什么实际用途，大家都在瞎忙活？我不太懂）；
在这篇文章中，lifesinger似乎又发现了uber方法的另一个漏洞或陷阱（这一点我不是很确定，麻烦lifesinger再确认一下，应为感觉uber方法没什么用途，所以本人还没有认真阅读）。
后话：
DC在2008年出版了他的大作Javascript: The Good Parts，有中文版，译者之一（小马）应该是lifesinger的同事。在书中的48页，提到了inherits方法，这一回的inherits实现很简单，完全没有提到uber方法，我不清楚DC为什么这么做？是不是因为DC发现复杂的uber方法根本没有用，而且很容易出错，干脆拿掉算了，这一点希望高手指点迷津。
象DC这样的大师或大牛，我们当然要多学习他们的文章或者观点，但是我们可能也还要保持独立的观点，大师也是人，也会犯错，而大师一犯错，错误也会是影响深远的。比如这个uber方法，Javascript的另一个大人物John Resig就在他的大作中（Pro JavaScript Techniques，也有中文版了）完全引用了uber方法（书中第3章），而且引用的是DC的错误的老版本（可惜了，又一个错误被大人物传开了，而且这个错误的东西似乎没有多大的用处）。</description>
		<content:encoded><![CDATA[<p>让我来把这整个故事整理一下，如果有问题，请大家指正和补充。<br />
跟这个故事有关的人物：<br />
1. Douglas Crockford (DC)<br />
2. chensheng<br />
3. John Hax 贺师俊<br />
4. lifesinger 射雕</p>
<p>首先是DC在他的网站上发表了一篇有关Javascript继承文章: Classical Inheritance in JavaScript，其中提出了inherits方法，这个方法实现很复杂，其中有包含有uber方法；<br />
结果chensheng发现了其中关于uber方法的一个错误，发表在CSDN上，时间是2006年12月28日；<br />
John Hax 与2006年12月31日在CSDN上连续发表评论，并且给出修正方法，同时还在在英文网站上给出修正；<br />
DC不知何时（估计是2007年）看到了John Hax的文章，并且修改了最初的文章，完全采用了Hax的修正（但是没有任何感谢Hax的表示，这让Hax很不高兴），DC同时在他的文章最后补充说：他写了8年的Javascript，从来没有用过uber方法，（这是否意味着uber方法没什么实际用途，大家都在瞎忙活？我不太懂）；<br />
在这篇文章中，lifesinger似乎又发现了uber方法的另一个漏洞或陷阱（这一点我不是很确定，麻烦lifesinger再确认一下，应为感觉uber方法没什么用途，所以本人还没有认真阅读）。<br />
后话：<br />
DC在2008年出版了他的大作Javascript: The Good Parts，有中文版，译者之一（小马）应该是lifesinger的同事。在书中的48页，提到了inherits方法，这一回的inherits实现很简单，完全没有提到uber方法，我不清楚DC为什么这么做？是不是因为DC发现复杂的uber方法根本没有用，而且很容易出错，干脆拿掉算了，这一点希望高手指点迷津。<br />
象DC这样的大师或大牛，我们当然要多学习他们的文章或者观点，但是我们可能也还要保持独立的观点，大师也是人，也会犯错，而大师一犯错，错误也会是影响深远的。比如这个uber方法，Javascript的另一个大人物John Resig就在他的大作中（Pro JavaScript Techniques，也有中文版了）完全引用了uber方法（书中第3章），而且引用的是DC的错误的老版本（可惜了，又一个错误被大人物传开了，而且这个错误的东西似乎没有多大的用处）。</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: xiaobao</title>
		<link>http://lifesinger.org/blog/2008/10/bug-in-crockford-uber-function/comment-page-1/#comment-3513</link>
		<dc:creator>xiaobao</dc:creator>
		<pubDate>Thu, 03 Dec 2009 14:59:48 +0000</pubDate>
		<guid isPermaLink="false">http://lifesinger.org/blog/?p=192#comment-3513</guid>
		<description>p = (this.prototype = new parent());
不明的上面为什么会加上括号
是为了代码简洁还是有什么其它 的原因</description>
		<content:encoded><![CDATA[<p>p = (this.prototype = new parent());<br />
不明的上面为什么会加上括号<br />
是为了代码简洁还是有什么其它 的原因</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: dexbol</title>
		<link>http://lifesinger.org/blog/2008/10/bug-in-crockford-uber-function/comment-page-1/#comment-114</link>
		<dc:creator>dexbol</dc:creator>
		<pubDate>Wed, 15 Apr 2009 08:02:02 +0000</pubDate>
		<guid isPermaLink="false">http://lifesinger.org/blog/?p=192#comment-114</guid>
		<description>看来不能盲目崇拜权威</description>
		<content:encoded><![CDATA[<p>看来不能盲目崇拜权威</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: robbenmu</title>
		<link>http://lifesinger.org/blog/2008/10/bug-in-crockford-uber-function/comment-page-1/#comment-113</link>
		<dc:creator>robbenmu</dc:creator>
		<pubDate>Thu, 08 Jan 2009 01:24:29 +0000</pubDate>
		<guid isPermaLink="false">http://lifesinger.org/blog/?p=192#comment-113</guid>
		<description>发现了又一个陷阱
http://blog.12km.com/index.php/archives/35/</description>
		<content:encoded><![CDATA[<p>发现了又一个陷阱<br />
<a href="http://blog.12km.com/index.php/archives/35/" rel="nofollow">http://blog.12km.com/index.php/archives/35/</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: jindw</title>
		<link>http://lifesinger.org/blog/2008/10/bug-in-crockford-uber-function/comment-page-1/#comment-112</link>
		<dc:creator>jindw</dc:creator>
		<pubDate>Fri, 10 Oct 2008 21:04:56 +0000</pubDate>
		<guid isPermaLink="false">http://lifesinger.org/blog/?p=192#comment-112</guid>
		<description>关于OO的产生和流行，可能是因为它迎合了人类原始的思考方式吧。
在js中完全模拟oo中的概念，让人闻到过度设计的味道，让某些人感觉别扭也就没什么奇怪的了。
关于大众需求，可与说，群众掌握了大部分真理。
新的真理只能被少数人掌握。而且在长时间里，这些都不能被大众接受。
这些问题，我们五千年的历史就是厚厚的证词。</description>
		<content:encoded><![CDATA[<p>关于OO的产生和流行，可能是因为它迎合了人类原始的思考方式吧。<br />
在js中完全模拟oo中的概念，让人闻到过度设计的味道，让某些人感觉别扭也就没什么奇怪的了。<br />
关于大众需求，可与说，群众掌握了大部分真理。<br />
新的真理只能被少数人掌握。而且在长时间里，这些都不能被大众接受。<br />
这些问题，我们五千年的历史就是厚厚的证词。</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: lifesinger</title>
		<link>http://lifesinger.org/blog/2008/10/bug-in-crockford-uber-function/comment-page-1/#comment-111</link>
		<dc:creator>lifesinger</dc:creator>
		<pubDate>Mon, 06 Oct 2008 10:07:31 +0000</pubDate>
		<guid isPermaLink="false">http://lifesinger.org/blog/?p=192#comment-111</guid>
		<description>to hax:

oo没错，但用传统的类模型套在javascript的原型模式上，总感觉有点别扭。为什么一定要子类、父类这些概念呢？this.super真的必须吗？

归根结底，我们要解决的问题是提高代码的可复用、可维护和可扩展。只要能达到目标就行，管它面向过程还是面向对象呢。传统的类模式的确能非常好的解决这些问题，因此在针对原型模式的设计模式总结出来之前，模拟类模型是最简单的一条路

但原型模式、动态语言，毕竟不同于传统的C++, Java, 更多的是一种编程思想的转变。怎样适应这种转变？在动态编程思想下怎样体现传统oo里的设计模式甚至创造出新的更好的模式？我觉得这些是很值得研究的。

存在即合理，但存在的未必是好的，人民群众有这个需求，也许是因为人民群众还未找到新的路，只好依着老路子走罢了……</description>
		<content:encoded><![CDATA[<p>to hax:</p>
<p>oo没错，但用传统的类模型套在javascript的原型模式上，总感觉有点别扭。为什么一定要子类、父类这些概念呢？this.super真的必须吗？</p>
<p>归根结底，我们要解决的问题是提高代码的可复用、可维护和可扩展。只要能达到目标就行，管它面向过程还是面向对象呢。传统的类模式的确能非常好的解决这些问题，因此在针对原型模式的设计模式总结出来之前，模拟类模型是最简单的一条路</p>
<p>但原型模式、动态语言，毕竟不同于传统的C++, Java, 更多的是一种编程思想的转变。怎样适应这种转变？在动态编程思想下怎样体现传统oo里的设计模式甚至创造出新的更好的模式？我觉得这些是很值得研究的。</p>
<p>存在即合理，但存在的未必是好的，人民群众有这个需求，也许是因为人民群众还未找到新的路，只好依着老路子走罢了……</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: lifesinger</title>
		<link>http://lifesinger.org/blog/2008/10/bug-in-crockford-uber-function/comment-page-1/#comment-110</link>
		<dc:creator>lifesinger</dc:creator>
		<pubDate>Mon, 06 Oct 2008 07:47:37 +0000</pubDate>
		<guid isPermaLink="false">http://lifesinger.org/blog/?p=192#comment-110</guid>
		<description>from hax@je:

呵呵。偶从csdn搬到blogspot用了一段时间，不过因为被墙了，就很少去更新了。BTW，dc同志拿了我的补丁也不打招呼，偶心里很不爽的说，所以偶要坚定自己坚决不用yahoo和YUI的决心……


搞笑完毕，说说正题。

dc的继承方案也只是万马奔腾中的一种。实际上有许多其他非常有意思的oo方案。譬如dean edwards的base。这个方案的特点是继承链是基于一个精心构造的base基类，相当于搞了一个Object2，而不会影响传统的Object的继承模式。另一个例子是prototype 1.6开始的Class继承，其特点是通过对源代码的分析来重写方法使之支持super调用（参见：http://hax.javaeye.com/blog/167131 ），缺点是函数被包装了一层，可能存在潜在的问题。其他的方式也有，譬如爱民的qomo框架是编写了一个通用的base方法，然后再其中通过Function.caller回溯调用链来找到应该调用哪个的父类方法，缺点是依赖caller这个非ECMA标准特性。

总而言之，偶并不完全赞同dc的看法。存在的就是合理的。各个框架都搞oo方案，说明人民群众有这个需求。。。</description>
		<content:encoded><![CDATA[<p>from hax@je:</p>
<p>呵呵。偶从csdn搬到blogspot用了一段时间，不过因为被墙了，就很少去更新了。BTW，dc同志拿了我的补丁也不打招呼，偶心里很不爽的说，所以偶要坚定自己坚决不用yahoo和YUI的决心……</p>
<p>搞笑完毕，说说正题。</p>
<p>dc的继承方案也只是万马奔腾中的一种。实际上有许多其他非常有意思的oo方案。譬如dean edwards的base。这个方案的特点是继承链是基于一个精心构造的base基类，相当于搞了一个Object2，而不会影响传统的Object的继承模式。另一个例子是prototype 1.6开始的Class继承，其特点是通过对源代码的分析来重写方法使之支持super调用（参见：http://hax.javaeye.com/blog/167131 ），缺点是函数被包装了一层，可能存在潜在的问题。其他的方式也有，譬如爱民的qomo框架是编写了一个通用的base方法，然后再其中通过Function.caller回溯调用链来找到应该调用哪个的父类方法，缺点是依赖caller这个非ECMA标准特性。</p>
<p>总而言之，偶并不完全赞同dc的看法。存在的就是合理的。各个框架都搞oo方案，说明人民群众有这个需求。。。</p>
]]></content:encoded>
	</item>
</channel>
</rss>
