Javascript Don';不使用getPrototypeOf?

Javascript Don';不使用getPrototypeOf?,javascript,ecmascript-5,Javascript,Ecmascript 5,在大约31分钟内,Crockford说他们(代表ECMAScript委员会发言)建议不要使用Object.getPrototypeOf。他的解释是,它并不是真正针对普通的开发人员,而是针对Caja这样的东西,它可能会将它从对象中删除,以阻止您访问它 Crockford有时会对如何使用JS的观点相当固执己见(难道我们都不能吗?),所以我想知道这是否真的是ES委员会的全部建议,还是Crockford的个人观点之一。有没有人读过任何官方声明,警告不要使用Object.getPrototypeOf?对我

在大约31分钟内,Crockford说他们(代表ECMAScript委员会发言)建议不要使用
Object.getPrototypeOf
。他的解释是,它并不是真正针对普通的开发人员,而是针对Caja这样的东西,它可能会将它从
对象中删除,以阻止您访问它


Crockford有时会对如何使用JS的观点相当固执己见(难道我们都不能吗?),所以我想知道这是否真的是ES委员会的全部建议,还是Crockford的个人观点之一。有没有人读过任何官方声明,警告不要使用
Object.getPrototypeOf
?对我来说,这听起来真的很糟糕:(,但我在MDN页面上没有看到任何关于使用它的警告信息,如果真的有那么糟糕的想法,我希望会有一个通知。

他的推理能力非常差。它(和
Object.getOwnPropertyNames
)并不是简单地为了使用Caja和类似的工具而添加的。Caja也不是简单地删除它们!Caja截取
Object.getOwnPropertyNames
,以实现
WeakMap
(它也可以),而且据我所知,它不会修改getPrototypeOf。实际上,由于
Object.getPrototypeOf,这样做毫无意义(o) 
o.是一样的。除了IE之外,每个浏览器都实现了
,并且(目前)无法关闭。这意味着从中删除
对象.getPrototypeOf
的浏览器对IE9和IE10有任何影响

我认为他会给出的原因是,其中一些函数主要用于“library author”类型的用法。这是参与规范过程的人们通常相信/说的话,我相信这是一个合法的声明;属性描述符/属性和其他“meta”级别API是更高级的功能,使用起来可能很麻烦,通常需要更全面的语言掌握才能正确使用。然而,这仍然不能等同于“不要使用它们”的笼统建议。不过,这一更准确的说法甚至不是他提出的论点

关于视频的另一个注意事项是,他在视频中做了一个不正确的陈述。他说属性属性(可枚举、可配置、可写)一旦设置就不可更改。这是不正确的。只要
configurable
为true,这些属性就可以更改。一旦设置为false,属性就会冻结(属性也不可删除)


编辑:在做了研究之后,我发现了一些关于这个特性和其他目标函数的原始讨论。 有人担心能够访问对象的[[Prototype]]所带来的安全问题。但是,这些问题通过object.freeze之类的方式得到了更全面、更恰当的解决,并且这些函数作为静态函数(可在一个位置删除)存在于对象上,这也是部分原因而不是在Object.prototype上,或者神奇地在每个对象上,比如proto,历史上一直是

提出的另一个问题是破坏封装

确实,proto或getPrototypeOf打破了对象的封装障碍,并揭示了可能有意隐藏的实现细节。对于建议的getProperty函数,也可以这样说,它让观察者能够访问实现getter/setter属性的函数.总的来说,这就是反思的本质。-艾伦·沃夫斯·布罗克

从实现端提出的一个问题是关于公开实现细节(主要是由于DOM如何工作而引起的问题,这一问题后来通过更改DOM对多重继承的使用以及向WebIDL的转换得到了解决)

另一方面,提供对对象原型的反射访问对兼容性是有害的,因为它阻止实现引入中间原型而不破坏Web。考虑只有数字的例子,然后兼容地引入更具体的子类型。——Waldemar Horwat

这个问题还与脚本协调邮件列表中提到的另一个问题有关,即内部隐藏原型是同一个交叉框架。这个问题也是ES5(和IE8)的历史问题每个框架都必须实例化自己的DOM原型集。因此,在ES5正式发布之前,出于这个原因隐藏原型已不再相关


我所看到的共识并不遵循克罗克福德的解释,大部分似乎只是重申了自己的观点

总之,不提供对对象原型的反射访问并不能真正提供任何安全性,它只会使一些有用的任务变得不那么方便。 -艾伦·沃夫斯·布罗克


总的来说,我同意你的观点,听到反思不是“真正安全”的敌人,这是件好事。 -布伦丹·艾奇


这方面的出发点是(由Crockford和其他人在TC39上撰写)接下来,我引用的是。具体地说,.

回答得很好。你的第二段非常相关,我认为……也许值得补充的是,如果你不编写库级代码,你应该能够自己维护原型的句柄,或者确保它们作为构造函数的属性可用……你真的y不需要独立的、非库代码的
getPrototypeOf
。+1谢谢你的回答。这正是我想听到的,因为作为一名库开发人员,我绝对希望能够免费使用
getPrototypeOf
。我希望你不介意我推迟几天接受答案/奖励奖金,因为我真的很乐意我有兴趣知道是否有关于