ES5 中的 Object.defineProperty?

2024-01-02

我看到关于“新”Object.create 的帖子,它使枚举可配置。但是,它依赖于 Object.defineProperty 方法。我找不到此方法的跨浏览器实现。

我们是否还在为旧的 Object.create 编写代码?我不能写在 IE6/7 中不起作用的东西。


有几件事是您无法从 ECMAScript 5 中模拟的Object.createECMAScript 3 环境上的方法。

正如您所看到的,属性参数会给您带来问题,因为在基于 E3 的实现中存在no way更改属性属性。

The Object.defineProperty方法如@Raynos提到过,可以在 IE8 上运行,但是部分地,可以使用only在 DOM 元素中。

Also 访问器属性会给你带来问题,它们可能是mimicked具有广泛支持的非标准方法,例如__defineGetter__ https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineGetter/__defineSetter__ https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineSetter,但是你再说一次无法更改属性属性.

除了属性描述符之外的另一个问题是Object.create方法可以接受null作为参数,创建一个不继承任何内容的对象。

这不能用以下方法模拟克罗克福德的Object.create shim http://javascript.crockford.com/prototypal.html,因为当new运算符与构造函数一起使用,该构造函数具有prototype属性包含null-或任何其他非对象值-,新创建的对象将继承自Object.prototype无论如何默认。

在一些实现中——V8、Spidermonkey、Rhino 等……——它们有一个可设置的__proto__ https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/proto属性可用于设置null[[Prototype]],但同样,这是非标准的,并且肯定它永远不会在 IE 上运行。

如果您想针对旧浏览器,我建议不要使用这些功能,因为没有办法让它们在这些环境中正常工作。

如果您还想使用Object.create,不使用特性争论,你可以,但是我建议你检测那些无法模仿的东西。

以下将是一个safer的版本克罗克福德的Object.create shim http://javascript.crockford.com/prototypal.html:

if (typeof Object.create != 'function') {
  (function () {
    var F = function () {};
    Object.create = function (o) {
      if (arguments.length > 1) { throw Error('Second argument not supported');}
      if (o === null) { throw Error('Cannot set a null [[Prototype]]');}
      if (typeof o != 'object') { throw TypeError('Argument must be an object');}
      F.prototype = o;
      return new F;
    };
  })();
}

无论如何,请谨慎使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ES5 中的 Object.defineProperty? 的相关文章

随机推荐

  • UITextView 中的占位符

    我的应用程序使用UITextView 现在我想要UITextView拥有一个类似于您可以为UITextField 这个怎么做 我对 bcd 的解决方案做了一些小的修改 以允许从Xib文件 文本换行并保持背景颜色 希望它能为其他人省去麻烦 U
  • HTML 表单通过提交“点击”触发器提交两次

    我很抱歉发布了一个与 SO 上近 100 个问题类似的问题 我读了很多 尝试了一些解决方案 但无法解决我的问题或完全将答案与我的问题联系起来 我有一个form通过操作 输入帖子 我有一个
  • msgraph-sdk-java 中对 beta API 的支持

    我们正在尝试访问一个团队的频道 API 该 API 处于测试阶段 API https graph microsoft com beta teams team id channels 似乎不支持beta来自 msgraph sdk java
  • 如何使用 Netbeans 调试 JavaScript 代码?

    我没有开发网络应用程序的经验NetBeans https netbeans org 我使用现有源 一些 HTML JS 和 CSS 文件 创建了一个 HTML5 项目 导入似乎没问题 但是我没能调试 JavaScript代码 因为 调试项目
  • VS 2015调试暂停颜色

    我正在调试该项目并点击 暂停 有时该线标记为绿色 最常见 有时标记为黄色 有什么区别 视觉工作室 2015 调试 C 控制台应用程序 net 4 5 绿线表示突出显示的语句上的代码正在执行 例如 代码可能正在等待事件或调用了一些没有可用源的
  • 上传食谱时出现 413 请求实体太大错误

    在我将 zip 文件放入食谱中然后将其上传到服务器后 我发现了此错误 有人可以建议我解决这个错误的正确方法吗 ERROR Failed to upload chef repo cookbooks api files default xx z
  • XSLT 更改元素顺序

    假设我有以下 xml
  • 如何从animationDidStop中删除CALayer对象?

    我正在尝试学习 iOS iPhone 的核心动画 我的根层包含很多子层 精灵 当它们被移除时它们应该旋转 我的计划是添加一个旋转动画 然后在调用animationDidStop 时删除精灵 问题是精灵层不是animationDidStop的
  • 使用 Apache Commons Math 插值函数

    我正在尝试实现一些插值函数来绘制一些值 其中 X 值 Date seconds 且 Y 值 double 我一直在研究使用Apache Commons Mathlib 来实现这一点 我找到了一种我认为可以使用的方法here http www
  • Eclipse-CDT:如何配置调试器以在出现异常时停止?

    这可能是一个 GDB 问题 但我想在调试器中运行我的应用程序 并在引发异常时让调试器中断 这样我就可以看到代码在哪里以及当时它在做什么 我经常在 Visual Studio 中使用 调试 gt 异常 对话框执行此操作 检查我想要停止的异常类
  • 有没有办法重置网络客户端?

    我在网络客户端解析一些非常敏感的网页时遇到问题 不知何故 网络客户端无法执行某些任务 我什至不知道为什么 没有例外 没有错误 只是简单地不起作用 这不是网站的问题 我循环运行 webclient 但是 只有第一个请求成功 所有接下来的请求都
  • 如何将 PdfPTable 插入现有 PDF 模板?

    Update 经过一番讨论 我们决定使用 TeX 特别是与 Windows 兼容的MiKTeX http www miktex org 我们意识到 即使我们可以通过微观管理布局来格式化动态加长表 这似乎不可能 或者与计算每行的行高一样繁琐
  • JavaFX 应该取代 Swing 吗?

    我习惯了 Swing 编程 也听说过 JavaFX 它是否应该取代 Swing 成为用 Java 编写桌面应用程序的首选平台 换句话说 我应该为我的新项目选择 JavaFX 吗 是的 JavaFX 正在取代 Swing 另请参阅Oracle
  • 文本字段、标签和按钮

    我在理解 GUI 以及为什么我的程序无法正常运行方面遇到了一些困难 是因为我必须扩展到 JFrame 类吗 这是一个代码 import java awt event ActionEvent import java awt event Act
  • 这个具有空捕获列表的 lambda 如何能够引用到达范围名称?

    在 C 14 标准 5 1 2 12 中 它显示了 lambda 表达式的示例 该表达式显然似乎能够引用到达范围的变量x 虽然 捕获列表为空 即没有捕获默认值 该评论说它 没有捕获x 这是例子 void f int const int 2
  • Emacs:定义命令输出的目标窗口

    我厌倦了 emacs 用它的输出来破坏我的窗口 而且是不可预测的 我想在 emacs 框架中有几个窗口 并且每个窗口仅用于特定目的 例如 ECB panels Editor 1 Editor 2 Bookmarks Messages out
  • Intellij 拒绝将 Kotlin 目标 jvm 设置为 1.8?

    ParallelStreams kts 41 15 error calls to static methods in Java interfaces are prohibited in JVM target 1 6 Recompile wi
  • 挂载Android模拟器创建的qcow2镜像

    我正在尝试挂载 Android 模拟器创建的 userdata qemu img qcow2 文件 以下过程不起作用 sudo qemu nbd c dev nbd0 android avd Pixel C API 27 avd userd
  • python optparse,如何在使用输出中包含附加信息?

    使用 python 的 optparse 模块 我想在常规使用输出下方添加额外的示例行 我当前的 help print 输出如下所示 usage check dell py options options h help show this
  • ES5 中的 Object.defineProperty?

    我看到关于 新 Object create 的帖子 它使枚举可配置 但是 它依赖于 Object defineProperty 方法 我找不到此方法的跨浏览器实现 我们是否还在为旧的 Object create 编写代码 我不能写在 IE6