据我所知(在Google Chrome控制台中),我们可以更改预定义功能的定义。让我通过代码解释:
function alert(){
return 2+2;
}
我正在调用alert("hi")
,它正在返回4,它正常,正如我们所定义的那样。
但是,即使我打电话给window.alert("hi")
,它也会返回4,这对我来说意外(对我而言)。
这里我刚刚创建了一个新函数,我没有提到任何对象名称或 Prototype 属性,但它仍然覆盖了窗口对象属性本身。
我怀疑的是,如果我们更改函数的定义,它是否会覆盖所有对象中具有相同名称的函数的定义?
我们说我有两个对象objA
和objB
,两个对象都有一个名为strange()
的函数。现在我在两个对象的外部定义一个函数strange()。那么,它是否会覆盖strange()
nad objA
中objB
的定义?如果是这样,为什么?
如果是这样,如何防止这种情况?意味着如何防止覆盖所有对象?
提前致谢...... !!!!
答案 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
,后一个将遮蔽前一个。
归结为函数的范围和函数(或变量)定义的闭包。
另见