【问题标题】:Can you make an object in Javascript which does NOT inherit from Object?你能在 Javascript 中创建一个不从 Object 继承的对象吗?
【发布时间】:2012-01-25 15:34:53
【问题描述】:

偶尔有一个 JS framework 或库认为在 ObjectArray 的原型中添加一些新功能是一个非常明智的想法。我现在找不到更多示例,但我确实记得我之前遇到过问题。当然,这样做会破坏旧的 for(...in...) 循环,因为突然间这些属性现在也被枚举了。要绕过它,您必须在访问之前使用.hasOwnProperty() 检查每个枚举属性。在尝试编写健壮的代码时,这很麻烦。

所以我想知道 - 有没有什么方法可以让我自己的对象不继承自 Object?最初使用.prototype 没有产生任何结果。也许它有一些技巧?还是一切都会继承自 Object 而我对此无能为力?

补充:我想我应该注意到我希望它用于浏览器中的客户端脚本,并且兼容性应该包括 IE6,或者至少 IE7。其他浏览器版本要求更宽松,当然越多越好。 (是的,可悲的是,企业界仍然生活在 IE 世界中……)

【问题讨论】:

  • for(...in...)循环肯定
  • @RobAgar - 为什么会这样?真的,我已经厌倦了写像for (var i, l = myArray.length; i < l; i++) 这样的东西。我渴望可靠的“foreach”构造,它是几乎所有当代语言的事实上的标准。
  • 通常是改变原型的框架,也提供了一种循环遍历元素的方法。在 Mootools 中,myObj.each() 将完成这项工作.. 还有["foo","bar"].each()
  • 因为for...in 不区分函数和非函数属性,这很少是我想要的。为了我的钱,像 Mootools each() 这样的迭代器提供了更好的 foreach 等价物。
  • 我认为也许覆盖 propertyIsEnumerable 可以工作,但我试过了,浏览器似乎不接受我的修改版本。

标签: javascript inheritance object


【解决方案1】:

在 ECMAScript 5 中,您可以将 null 传递给 Object.create

> obj = Object.create(null);
  Object
    No Properties

【讨论】:

  • 哇!惊人的!它确实有效!除了浏览器兼容性很差。 :( 我想我应该说我在 IE6 或至少 IE7 上需要它。
  • 我认为在这种情况下你运气不好,使用.hasOwnProperty是你唯一的机会。
【解决方案2】:

您可以显式删除任何可枚举的 Object 属性, 但现代浏览器允许不可枚举的 Object 方法。

应该可以在旧版浏览器中使用。

function Myobject(props){
}
var O=Object,OP=Object.prototype;
for(var p in O)delete Myobject[p];
for(var p in OP)delete Myobject.prototype[p];

【讨论】:

  • 有趣的想法,将尝试。而且 - 如果它们是不可枚举的,那么它已经可以了。我首先只关心可枚举的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-22
  • 1970-01-01
  • 1970-01-01
  • 2011-05-13
  • 1970-01-01
  • 2011-06-12
相关资源
最近更新 更多