尝试覆盖警报,它可以工作,但执行两次

时间:2013-03-20 01:56:47

标签: javascript prototype overloading alert override

所以,叫我懒惰,但我正在尝试为Javascript的警报功能添加一些语法糖。这是代码:

<script src='jquery.js'></script>
<script>
window.nativeAlert = window.alert
window.alert = function() 
{
    window.nativeAlert(Array.prototype.slice.call(arguments).join(", ")+" window")
    return this
}
Array.prototype.alert = function()
{
    window.nativeAlert(this.toString()+" array")
    return this
}
Object.prototype.alert = function()
{
    window.nativeAlert(this.toString()+" object")
    return this
}
$(function()
{
    var features = $.getJSON("features.json")
    features.alert()
})
</script>

这似乎有效,但是两次开火。知道为什么会这样吗?我的直觉说它与重载有关,但对于数组和[window。] alert()它可以正常工作(触发一次)。

P.S。我知道JSON将无法正常显示,这是为了以后。

1 个答案:

答案 0 :(得分:5)

这是一个棘手的问题,它需要在调试器中逐步调试调用堆栈才能看到发生了什么。

正在发生的事情是alert被添加为每个对象的属性。这包括从features.json文件反序列化的对象。

.getJSON请求完成后,jQuery会解析从文件返回的JSON字符串。当jQuery找到作为函数的对象的属性时,它会执行它。由于您的alert是对象的属性,因此会调用它。

这很好地说明了为Object.prototype添加方法的原因。任何试图迭代对象属性的东西也会遇到自定义原型属性。