3

所以,叫我懒惰,但我正在尝试向 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() 工作得很好(触发一次)。

PS 我知道 JSON 还不能正确显示,以后再说。

4

1 回答 1

5

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

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

一旦.getJSON请求完成,jQuery 就会解析从文件返回的 JSON 字符串。当 jQuery 发现对象的属性是一个函数时,它会执行它。由于 youralert是对象的属性,因此它调用它。

这很好地说明了为什么向Object.prototype. 任何试图遍历对象属性的东西也会遇到自定义原型属性。

于 2013-03-20T02:21:05.243 回答