gpt4 book ai didi

javascript - 如何(暂时)覆盖 Object.prototype.toString 或任何其他 JS native 代码

转载 作者:行者123 更新时间:2023-11-29 23:32:20 27 4
gpt4 key购买 nike

在现代浏览器上下文中的 JS 中(特别是 Chrome,但任何答案都很有趣)我如何临时覆盖 Object.prototype.toString 或任何其他 native 代码方法,以便新实现实际接收通过 call 调用时传递给它的值 ?

这是明显/直观的方法(在浏览器开发工具面板中运行),但它不起作用:

console.log(Object.prototype.toString)
// (output) > ƒ toString() { [native code] }

Object.prototype.toString.call(new Date())
// (output) > "[object Date]"

Object.prototype.toString = function (value) {
console.log(`value is ${value}`)
return 'foo'
}

Object.prototype.toString.call(new Date())
// (output) > value is undefined
// (output) > "foo"

两个问题:

  1. 为什么上面的value是未定义的?
  2. 有没有办法覆盖/猴子补丁 Object.prototype.toString 以便将函数参数传递给新实现?

你可以在这里停止阅读,不会遗漏任何与上述问题相关的内容


背景/背景

肯定会有一些“你为什么要这样做”的回答。上下文是基于 Selenium/Protractor 的生产验证套件,在真实 API(无模拟数据)之上运行,该套件需要将浏览器时间提前一个月,以便某些 UI 操作可用。

我最近发现任何解决方案 replaces the Date object将不适用于 Angular 1.x,因为 Angular 有一个 isDate 方法调用 - 你猜对了 - Object.prototype.toString.call(dateCandidate) 如果不返回确切的字符串 [object Date] 那么任何 Angular 日期格式化代码都将不起作用。

有问题的 Angular 代码:

Angular 讨论为什么他们不会改变行为:https://github.com/angular/angular.js/issues/7143

这给我留下了几个糟糕的选择。这个问题正在推进“为什么我们不为 Angular 打一个单行补丁,然后按需覆盖 Object.prototype.toString 实现以返回 [Object Date] timeshift-js mock Date object' 选项,这是我们不良解决方案列表中的当前领跑者。

最佳答案

你输入了错误的参数,callbindapply的第一个参数是context,不是被调用函数的参数

这段代码:

Object.prototype.toString.call(new Date())
// (output) > value is undefined
// (output) > "foo"

应该是:

Object.prototype.toString.call(this, 'Bar')
// (output) > value is Bar
// (output) > "foo"
// this one also valid because you don't care about context
Object.prototype.toString.call(null, 'Bar')

原生的 .toString 没有任何参数,因为它用于解析触发它的 Object 为 String。例如,如果我想对原生的做同样的事情,我会像这样修改 toString

Object.prototype.toString = function() { 
return JSON.stringify(this);
}
var a = { foo : 'bar'}
Object.prototype.toString.call(a);
// or
a.toString()
// has the same output:
// "{"foo":"bar"}"

关于javascript - 如何(暂时)覆盖 Object.prototype.toString 或任何其他 JS native 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46922583/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com