我喜欢这个问题 - 函数构造函数的合法使用 - 所以我想创建一个关于Array
构造函数的类似问题.
当然,数组文字表示法是创建数组的正确方法.这意味着new Array
不应使用符号.并且"案件结案".
但是,new Array
表格有一个特殊性.如果传入自然数,则会创建一个空数组,并将其length
属性设置为该数字.
所以
arr = new Array( 7 );
Run Code Online (Sandbox Code Playgroud)
相当于
arr = [];
arr.length = 7;
Run Code Online (Sandbox Code Playgroud)
这可以被视为一项功能.我想知道这个"功能"是否具有实际用途.我最近偶然发现了一个这样的(简单)用法:
new Array( n + 1 ).join( '*' ) // returns string containing n stars
// e.g.
new Array( 3 ).join( '*' ) // returns '**'
new Array( 6 ).join( '*' ) // returns '*****'
Run Code Online (Sandbox Code Playgroud)
这很酷,但希望有一些更高级的用途.(可以使new Array
符号成为JavaScript程序中合法工具的东西.)
更新:我注意到jQuery库new Array( len )
在一个实例中使用了表示法 - 它在when …
通常,java-script允许覆盖(扩展新行为)除了那些未冻结或密封的对象之外的任何函数.在JavaScript中,Math是一个内置对象.但是为什么JavaScript提供了覆盖内置对象中现有属性的权限?
请找截图:最初我发现数学对象中有min函数.我已经用功能更新了"min"属性.此操作替换了现有代码.为了更清楚,我已从"min"删除了该属性.这里删除应该删除扩展行为而不是核心行为.但它正在消除核心属性为什么?
很多时候,我编写的 JavaScript 与其他脚本一起运行或者可能包含其他脚本。有时,这些脚本可能会更改我可能在代码中使用的原始对象的原型。
有没有一种方法可以在 JavaScript 中声明我的原始数据类型,以便在原型被修改时重置原型?或者让我的脚本可以在一个单独的范围内运行,其中原语的原型不会被修改?
// evil script code modify primative on prototype
Boolean.prototype.toString = function() {
return true;
}
let flag = false;
console.log(flag.toString());
// I would expect false to be printed, but because the prototype of the primative if overridden
// the primative value would be wrapped with the Boolean object
// and call the modified toString method and would output true.
Run Code Online (Sandbox Code Playgroud)
有什么方法可以确保我的代码在单独的范围内运行,或者有什么方法可以声明我的变量或重置原型以避免这些类型的问题?
假设您有一个脚本需要在覆盖 javascript 的 JSON 的页面上运行。stringify,您将如何确保您的代码将使用原始的 stringify 而不是被覆盖的?
对于我正在编写的脚本,我想使用本机 window.open 方法。然而,一个我无权访问的已加载脚本会用布尔值覆盖全局 window.open 方法(哎呀)。
我知道如何恢复文档上的方法(通过 HTMLDocument.prototype),但我不知道如何在窗口上恢复它们,因为我似乎找不到与窗口等效的方法。例如,Window.prototype.open 不存在。
我尝试创建一个 iframe,并从 iframe 中的 contentWindow 获取 open 方法,但浏览器将阻止使用打开窗口,open
因为它可能是在另一个源中创建的。两者都delete open;
不起作用,因为是在全局加载的脚本中open
使用定义的。var
那么,如何恢复open
Chrome 中定义为“本机代码”的方法呢?
我知道周围也有类似的问题,但实际上主要问题是:
Window 对象是否有相当于 HTMLDocument 的对象?