Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么JavaScript允许访问重写内置对象中的现有属性_Javascript - Fatal编程技术网

为什么JavaScript允许访问重写内置对象中的现有属性

为什么JavaScript允许访问重写内置对象中的现有属性,javascript,Javascript,通常,java脚本允许覆盖(扩展新行为)除未冻结或密封的对象之外的任何函数。在JavaScript中,Math是一个内置对象。但是为什么JavaScript允许访问重写内置对象中的现有属性呢 请查找屏幕截图:最初我发现Math对象中有min函数。我已经用函数更新了“min”属性。此操作替换了现有代码。 为了更清楚,我从“min”中删除了属性。在这里,删除应该删除扩展行为,而不是核心行为。但它正在移除核心资产,为什么 脚本的一个本质是快速原型化。您可以将此功能排序为javascript的非严格声明

通常,java脚本允许覆盖(扩展新行为)除未冻结或密封的对象之外的任何函数。在JavaScript中,Math是一个内置对象。但是为什么JavaScript允许访问重写内置对象中的现有属性呢

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


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

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

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

尽管如此,您仍然可以从本机对象继承,您可以在本文中了解更多关于本机对象的信息。

扩展或修改本机代码被称为扩展或修改本机代码,这是一种设计功能,而不是设计缺陷。事实上,Javascript中的一切都是可变的和可扩展的,因此您有能力改变基本原理以满足自己的需要(例如,您可以重载min方法,使其能够处理不同的变量类型,而不仅仅是整数和浮点数),但伴随着这种能力,责任也随之而来,因此,除非您知道自己在做什么,否则一般不建议更改这些标准函数;同样,您必须意识到,如果您的JS文件将在其他人的环境中运行,您可能无法依赖您认为可以依赖的一切(但是,您通常应该能够期望使用常规的全局方法和属性,这就是为什么您可以调用global Object.prototype.keys或Array.prototype.slice,而不是期望该方法位于任何特定对象的原型上)


简而言之,当你删除一个你修改过的函数时,你将完全删除它,而不是将它恢复到某种原始状态。你基本上是重写了原始的,因此没有办法恢复它(除非删除覆盖它的代码!).

感谢大家回答我的问题。我从大家那里得到了宝贵的信息。我自己对此做了一些分析。我已经阅读了ECMA-262规范。我在数学中找到了一些类似“E”的属性及其配置

根据规范文件

15.8.1.1 E

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

然后我了解了数学的一些属性,因为“可配置”属性,我们不能删除这些属性。 当我执行以下代码时,在retured对象中我发现'min'属性为'configurable:true'

getOwnPropertyDescriptor(数学,“min”); 对象{值:函数,可写:真,可枚举:假,可配置:真}

我同意用户162097的说法,他说“这是一个设计特性,而不是设计缺陷。”


感谢

,因为这就是它的设计方式。(不知道为什么,但确实如此。)它甚至可以覆盖整个
数学对象。可能是为了更好、更准确地自定义实现它的函数,但剩下的答案是+1!