网页错误详细信息
I!bzvPJ]xc (1e;7sNG@ 用户代理: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; BRI/2)
ju8mO& 时间戳: Fri, 25 Mar 2011 07:34:31 UTC
2YvhzL[um G
hH0-g{- k#k !AcC 消息: 对象不支持“__defineSetter__”属性或方法
FY"!%)TV 行: 3
Ikiv+Fq( 字符: 3
-05zcIVo 代码: 0
jYKs| J)[ URI:
http://www.shanse8.com/bbs/js/desktop/Compatibility.js SPA_a\6_ b\~rL,7( 摘自斩梦人的文章
,vP9oY[n ~V3pj('/)' 为什么IE9没有这些 _ _ 方法?
o2? [*pa b8)>:F FCQI fJ# ES5包括getter/setter方法的支持。类似的功能已经在某些有多年历史的Web浏览器中实现了。在那段时期,浏览器开发者尝试用各种语法和API来定义这些方法。在此ES5之前,最广泛实现getter/setter的API是两个称为__defineGetter__和__defineSetter__方法。周围有两个下划线的方法名是一个不成文的规定,一些浏览器开发人员使用这样的名称来标识实验性的功能或在特定的Javascript实现中提供的底层访问功能。
YhFB*D; &k(t_~m> ECMA的TC39委员会认为getter/setter方法应包括在ES5规范内,因为它们的价值已经清楚地显示出来。然而,TC39选择设计一套新的API来定义它们而不是使用非标准的 __defineXXX__ API。
,eD@)K_: 1g{`1[.QO TC39为什么要这样做?由于各浏览器提供的API存在相当大的差异。用共同的语义规范标准化这些方法 ,意味着有些或者全部现有浏览器的实现必须改变,以符合新的语义。这可能会导致一些在特定浏览器中的应用程序无法正常工作。
cX"[#Em# mzTF2K
另一个原因是保持一致的命名规定。没有任何其他的ECMAScript内置名称使用下划线作为开头或结束。这些实验性的名名称或特定的功能名字已被广泛使用,而把惯用的名字于标准化特性,都会产生误导作用并削弱未来实验中的公有惯例。
PH97O`" a?E]-Zf TC39开发出一种新的API以Object.defineProperty方法为基础。不仅支持此API定义的getter/setter属性,也支持ES5的其他新功能。__defineXXX__这样的方法在ES5规范中不被考虑。
=UA-&x@ NZYtA7 为了兼容,已实现__defineXXX__API的浏览器可以不做任何修改继续提供支持。然而,在支持ES5标准的通用浏览器中编写的新的代码,应该使用Object.defineProperty定义的getter/setter属性。
ya{vR*
'~ b")&"o)G2W 我们仍然收到一些反馈,要求我们在IE9中添加__defineXXX__ API。我们理解为什么。有些开发人员的代码已经使用了这些API,他们希望不做修改就能在IE9中运行。不过,我们认为提供这些API不符合让互联网更通用的初衷。 TC39已经考虑过这些API,并得出结论认为不应该标准化。如果IE9支持__defineXXX__API,将使这种API成为永久的“共识功能”,基本上掩盖了TC39的决议。
~|@ aV:k wA)
NB 不幸的是,在短期内这种变化为正在使用旧API的开发人员增加了少量的工作量。在这期间为您的代码建立一个简单的兼容库,用Object.defineProperty来实现__defineXXX__ API,代价是微不足道的。
'(Uyju= ,XCC#F(d1 D<5)i)J"