我正在尝试定义内置方法alert()
以查看控制台会抛出什么样的错误,而是内置的alert()
被覆盖。
这是代码 -
function alert(some_string) {
console.log(some_string+some_string);
}
function say() {
alert("Hello");
}
say();
输出为: HelloHello
来自Java背景,它会抛出编译错误:
错误:方法alert()已定义
那么这里发生了什么?我真的覆盖了这个方法吗?
答案 0 :(得分:3)
Overriding是一个经典的OO术语,这意味着子类具有与其继承的类之一具有相同名称的方法,而不是在子类上使用该方法。
在这种情况下,您可以直接获取alert
变量(默认情况下具有浏览器提供的函数值)并为其指定一个新值(您刚刚声明的函数)。
(假设您正在全局范围内工作。如果您在本地范围内,您只需要屏蔽变量,这样您就只能使同一范围内的其他代码无法访问alert
...你也在编写代码,它不会成为一个问题,因为你会知道你是否需要全局alert
并且可以避免重复使用它的名字。)
可能有数百个内置函数,我可能会意外地定义一个与其中一个函数同名的函数,如何检查这些事故是否发生?
有两种基本技巧。
避免创建全局
创建新变量时,请在尽可能窄的范围内进行。一种常见的模式是使用IIFE为与给定代码相关的所有变量创建新范围。
(function () {
"use strict";
function alert() {
// Locally scoped alert that doesn't get in the way
// of any variable called `alert` from the browser
// or another library
}
})();
使用命名空间
这只是将单个全局作为一堆相关代码的入口点的术语。它通常被赋予一个不太可能与其他代码冲突的ALL_CAPS名称。
这允许从任何地方访问函数,比如全局变量,而不会创建大量的全局变量。
var MYLIBRARY;
(function () {
"use strict";
MYLIBRARY = {
alert: alert
};
function alert() { /* etc */ }
})();