扫码关注官方订阅号
function fn(){ console.log(1); } fn.toString = function(){ return 30; } console.log(fn);
不懂为什么打印结果是30..
小伙看你根骨奇佳,潜力无限,来学PHP伐。
console.log输出函数时调用其toString方法。因为你复写了函数的toString并return 30所以才会输出30呀。不然应该是function function。应该是前者表示类型后者表示值。
在浏览器里面console.log("%s",fn) 才会调用 toString
console.log("%s",fn)
toString
console.log()参数如果是对象的话,会转化为字符串形式,也就是调用这个tostring方法
console.log()
对象(包括函数)默认自身是没有toString()方法的,会根据__proto__链一路找到Object,这方法是它的,现在你给fn指定了它自己的toString方法,并且指定了返回值为30,那打印结果当然是30了;
查询一个对象中的属性时,如果在对象内找不到,就会去原型找,如果找到,就直接返回,就这么简单.
有一个博主说过,有些时候是会自动调用valueOf和toString的。当你直接fn时输出的是函数体,其实相当于执行fn.valueOf(),在这里因为你改写了toString所以优先调用改写的那个,所以fn执行的也就是fn.toString()
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
console.log输出函数时调用其toString方法。因为你复写了函数的toString并return 30所以才会输出30呀。不然应该是function function。应该是前者表示类型后者表示值。
在浏览器里面
console.log("%s",fn)才会调用toStringconsole.log()参数如果是对象的话,会转化为字符串形式,也就是调用这个tostring方法对象(包括函数)默认自身是没有toString()方法的,会根据__proto__链一路找到Object,这方法是它的,现在你给fn指定了它自己的toString方法,并且指定了返回值为30,那打印结果当然是30了;
查询一个对象中的属性时,如果在对象内找不到,就会去原型找,如果找到,就直接返回,就这么简单.
有一个博主说过,有些时候是会自动调用valueOf和toString的。当你直接fn时输出的是函数体,其实相当于执行fn.valueOf(),在这里因为你改写了toString所以优先调用改写的那个,所以fn执行的也就是fn.toString()