为什么JavaScript提供了覆盖内置对象中现有属性的访问权限

时间:2014-05-28 08:58:48

标签: javascript

通常,java-script允许覆盖(扩展新行为)除了那些未冻结或密封的对象之外的任何函数。在JavaScript中,Math是一个内置对象。但是为什么JavaScript提供了覆盖内置对象中现有属性的权限?

请找截图:最初我发现数学对象中有min函数。我已经用功能更新了“min”属性。此操作替换了现有代码。 为了更清楚,我已从“min”删除了该属性。这里删除应该删除扩展行为而不是核心行为。但它正在消除核心属性为什么?

enter image description here

4 个答案:

答案 0 :(得分:3)

扩展或修改本机代码称为monkey-patching,这是一个设计特性而不是设计缺陷。实际上,Javascript中的所有内容都是可变的和可扩展的,因此您可以根据自己的需要更改基础知识(例如,您可以重载min方法,以便它可以使用不同的变量类型而不仅仅是整数和浮点数),但具有该功能有责任,所以除非你知道你在做什么,否则通常不建议改变这些标准功能;同样,您必须要知道,如果您的JS文件将在其他人的环境中运行,您可能无法依赖您认为可以的所有内容(但是,您通常应该能够期望通常的全局方法和属性,这就是为什么你可以调用全局Object.prototype.keys或Array.prototype.slice而不是期望该方法在任何一个特定对象的原型上。)

简而言之,当您删除已修改的功能时,您将完全删除它,而不是将其恢复为某种原始状态。你基本上覆盖了原文,因此无法取回它(除非删除覆盖它的代码!)。

答案 1 :(得分:2)

感谢大家回答我的问题。我从每个人那里获得了宝贵的信我对此做了一些分析。我已经通过了ECMA-262规范。我在Math中找到了一些像'E'这样的属性及其配置。

根据规范文件http://www.ecma-international.org/ecma-262/5.1/#sec-15.8.1

15.8.1.1 E

e的数值,自然对数的基数,约为2.7182818284590452354。 此属性具有{[[Writable]]:false,[[Enumerable]]:false,[[Configurable]]:false}。

然后我开始了解Math的一些属性,因为'Configurable'属性我们无法删除。 当我执行下面的代码时,在retured对象中,我找到'configurable:true'的'min'属性。

Object.getOwnPropertyDescriptor(Math,“min”); Object {value:function,writable:true,enumerable:false,configurable:true}

我同意 user162097 正如他所说'这是设计特征而非设计缺陷。'

由于

答案 2 :(得分:1)

不能正常工作。 delete函数正在从您的对象中删除属性。 不知道该对象是原始对象还是被覆盖的对象,这就是为什么覆盖内置函数行为不是最佳实践。 您可以在该对象原型中创建自己的函数,而不是更改本机函数行为,例如,让我们为Array对象创建remove函数:

Array.prototype.remove =  function(member) {
  var index = this.indexOf(member);
  if (index > -1) {
    this.splice(index, 1);
  }
  return this;
}

尽管如此,您可以从本机对象继承,有关此内容的更多信息,请参阅此article-inheriting from native objects

答案 3 :(得分:0)

脚本的一个特性是快速原型。您可以将此功能排序为javascript的非严格声明方面。