我们可以更改预定义函数的定义吗?然后如何预防呢?

时间:2014-06-05 13:16:57

标签: javascript

据我所知(在Google Chrome控制台中),我们可以更改预定义功能的定义。让我通过代码解释:

function alert(){
  return 2+2;
  }

我正在调用alert("hi"),它正在返回4,它正常,正如我们所定义的那样。 但是,即使我打电话给window.alert("hi"),它也会返回4,这对我来说意外(对我而言)。

这里我刚刚创建了一个新函数,我没有提到任何对象名称 Prototype 属性,但它仍然覆盖了窗口对象属性本身。

我怀疑的是,如果我们更改函数的定义,它是否会覆盖所有对象中具有相同名称的函数的定义?

我们说我有两个对象objAobjB,两个对象都有一个名为strange()的函数。现在我在两个对象的外部定义一个函数strange()。那么,它是否会覆盖strange() nad objAobjB的定义?如果是这样,为什么?

如果是这样,如何防止这种情况?意味着如何防止覆盖所有对象?

提前致谢...... !!!!

4 个答案:

答案 0 :(得分:3)

否 - 通过声明function alert()您正在重新定义window.alert()函数,因为默认范围是窗口

var newObj = {
    alert: function() {
        return "this is a functino on my newObj object";
    }
};

function alert() {
    return 2 + 2;
}

console.log(alert());
console.log(window.alert());
console.log(newObj.alert());

答案 1 :(得分:1)

定义警报覆盖window属性的原因是因为你在全局上下文中声明了它;默认情况下,在全局上下文中声明的任何内容都会附加到window。要不覆盖window对象,请在另一个函数内声明您的函数(或使用其他名称):

// This creates an anonymous function
(function() {
  // Since alert is defined in this function (not the global scope)
  // It won't override window.alert
  function alert() { /* Do something */ }
})();
// You can no longer access the old alert here, so alert will refer to window.alert

此外,如果您向特定对象添加警报,它将不会更改任何其他对象的警报,除非您使用with语句(被视为不良做法)。

var myNamespace = {
  alert: function() { /* Custom alert */ }
}
// Will not change myNamespace.alert
function alert() {}

答案 2 :(得分:1)

不,我不这么认为 - 使用提醒功能,“窗口”。假设前缀是真的,window.alert()和alert()是一回事。我想这是阻止你输入窗口的捷径。一直以来。

关于你的另一个例子,objA.strange()与objB.strange()无关(假设objA和objB实际上是不同的对象)。

这两个对象之外的函数odd()实际上是在window.strange()中(暗示),所以它又是一个不同对象下的不同函数。

我可以使用原型来重新定义原生JS函数,但这通常是不可取的。

答案 3 :(得分:1)

如果在javascript中定义默认范围内的变量或函数(例如直接在<script>标记内创建函数),则将其视为窗口对象的一部分(如果javascript在浏览器环境中执行) )。

因此,当您调用(默认)alert时,您实际上正在调用window.alert

  

我们说我有两个对象objA和objB,两个都有一个功能   名为strange()。现在我在外面定义一个函数strange()   两个对象。然后,它是否会覆盖定义   objA nad objB中的strange()

对象范围(闭包)之外的strange的定义不会影响对象中函数(方法)的定义。但是如果你再次在对象中定义strange,后一个将遮蔽前一个。

归结为函数的范围和函数(或变量)定义的闭包。

另见