当前位置: 首页 > 面试题库 >

将自定义函数添加到Array.prototype

元俊雅
2023-03-14
问题内容

我正在研究启用AJAX的asp.net应用程序。我刚刚向Array.prototype添加了一些方法,例如

Array.prototype.doSomething = function(){
   ...
}

该解决方案对我有用,可以以“漂亮”的方式重用代码。

但是,当我测试了它与整个页面一起使用时,我遇到了问题。我们有了一些自定义的Ajax扩展程序,它们开始表现出意想不到的效果:某些控件在其内容或值上显示为“未定义”。

这可能是什么原因?我是否缺少修改标准对象原型的东西?

注意:我很确定,当我为Array修改原型时,错误就开始了。它应该仅与IE兼容。


问题答案:

通常,修改内置对象原型不是一个好主意,因为它总是有可能与其他供应商或加载在同一页面上的库的代码发生冲突。

在Array对象原型的情况下,这是一个特别糟糕的主意,因为它有可能干扰在任何数组的成员上迭代的任何代码段,例如使用for .. in

为了举例说明:

Array.prototype.foo = 1;

// somewhere deep in other javascript code...
var a = [1,2,3,4,5];
for (x in a){
    // Now foo is a part of EVERY array and 
    // will show up here as a value of 'x'
}

不幸的是,这样做的可疑代码的存在使得有必要也避免使用简单for..in的数组迭代,至少如果您想要最大的可移植性,只是为了防止其他一些令人讨厌的代码修改了Array原型的情况。因此,您确实需要同时做这两个事情:for..in如果某些n00b修改了Array原型,则应避免使用plain,并且应避免修改Array原型,以免弄乱任何使用plain
for..in来遍历数组的代码。

您最好创建自己的带有doSomething函数的对象构造函数类型,而不是扩展内置Array。

Object.defineProperty

现在,存在Object.defineProperty一种扩展对象原型的通用方法,而无法枚举新属性,尽管这仍然不能证明扩展 内置
类型的合理性,因为即使如此for..in,它仍然可能与其他脚本发生冲突。考虑使用两个Javascript框架的人,它们都试图以相似的方式扩展Array并选择相同的方法名称。或者,考虑有人分叉
您的 代码,然后将原始版本和分叉版本都放在同一页面上。Array对象的自定义增强功能是否仍然有效?

这是Javascript的现实,也是为什么即使使用,也应该避免修改内置类型的原型的原因Object.defineProperty。用自己的构造函数定义自己的类型。



 类似资料:
  • 问题内容: 我已经构建了自己的自定义react-bootstrap Popover组件: 该组件的呈现方式如下: 现在,我想向组件中添加自定义道具,例如:我的文字,并使用新道具在弹出框中设置一些内容,例如- 但随后我在浏览器中收到此警告: 警告:标签上的未知道具。从元素中删除这些道具。 现在,我想我可以删除零件并逐个插入所有原始道具,而无需自定义道具,但是这样我就失去了“淡入淡出”效果,这也是处理

  • 问题内容: 我正在尝试通过向其传递自定义数据源来填充表。我创建了一个带有表的简单报告。它自己的报告从ms sql数据库获取数据。我已经编写了一个与本示例类似的java类。但是我在表中没有任何价值。在该示例中,没有脚本。我已经检查了 代码行。它从现场获取数据并可以在报告中显示。因此,我猜想bean数据源未填充。我在中调用fill Table方法。如何在Jasper中使用来自Java的数据收集?我也尝

  • 我正在尝试通过将自定义数据源传递给表来填充表。我创建了一个带有表格的简单报告。它自己从 ms sql 数据库中获取数据的报告。我编写了一个类似于此示例中的类的 java 类。但我在表中没有得到任何值。在示例中,没有脚本。我已经检查了 代码行。它从字段中获取数据,并可以在报告中显示。所以我想 bean 数据源没有填充。我在 中调用 fill Table 方法。如何在 jasper 中使用 java

  • 如果我创建一个继承JComponent的新类,我重写了JComponent的绘图Component(Graphics g)方法,通过使用g绘制一个圆圈,我应该修改什么才能使MouseListener仅在我单击组件的边界内时触发? 因为我在组件的构造函数中添加了setBounds(…)然后添加了一个MouseListener,但它会在我每次单击自定义组件所在容器中的任何位置时触发,而不仅仅是在我单击

  • 我一直在尝试向<code>PYTHONPATH</code>添加一个自定义目录。我在Mac上使用bash,如果相关的话。这就是我所做的: < li> < li> 并保存 < li> 有两个问题: < li >当我在Python IDE中运行< code>sys.path时,目标目录仍然没有出现。 < li >当我在终端中启动Python并在那里运行< code>sys.path时,确实显示了目录,

  • 我已经搜索了又搜索,除了我称之为“hack方法”的方法之外,找不到其他方法将自定义分类添加到自定义管理菜单中。 然后我注册我的帖子类型并确保它们使用 这可以工作,自定义帖子类型显示在我的自定义菜单中。 但是自定义分类法不接受同一属性的字符串,只接受true或false。 因此,要添加它,您必须创建一个子菜单页 这是一种“黑客”方式。 还有别的办法吗?如果不修改WordPress核心,我可以覆盖re