检查toString是否已分配

Checking whether toString has been assigned

本文关键字:分配 是否 toString 检查      更新时间:2023-09-26

我想要一个调试输出函数包含一个测试:如果对象有toString函数,使用它。

但是,每个JavaScript对象都有一个toString函数,所以我真正想要的是检查它是否被赋值为toString,而不是仅仅继承一个默认的。

最好的方法是什么?我突然想到,也许你可以利用继承函数在for-in迭代中不可见的事实,尽管感觉应该有一个0(1)的解决方案。

之类的obj.hasOwnProperty('toString')

obj.hasOwnProperty('toString')的结果取决于您创建toString实现的方式。我做了一些简单的测试:

function A() {
}
A.prototype.toString = function(){
   console.log("A.toString");
};
function B() {
   this.toString = function(){
      console.log("B.toString");
   }
}
var t = [new A(), new B(), new A()];
for(var i=0; i<t.length; i++) {
    var hasOwnToString = t[i].hasOwnProperty("toString");
    console.log(hasOwnToString);
    if(hasOwnToString) {
       t[i].toString();
    }
}
结果:

false
true
B.toString
false

A样式是false, B样式是true

您可以检查toString函数是否与Object(所有对象的派生对象)相同

function hasUserPrototype(obj) {
    return Object.getPrototypeOf(obj).toString !== Object.prototype.toString;
}

参见检查对象是否有用户定义的原型?

function Foo() 
{
}
// toString override added to prototype of Foo class
Foo.prototype.toString = function()
{
    return "[object Foo]";
}
var f = new Foo();
function Boo() 
{
}
var g = new Boo();
function hasUserPrototype(obj) {
    return Object.getPrototypeOf(obj).toString !== Object.prototype.toString;
}
document.write(hasUserPrototype(f)); // true
document.write(hasUserPrototype(g)); // false

var x = {}
if (!(x.hasOwnProperty("toString"))) {
  x.toString = function() {
    return "I am X"
  }
}
x.toString()
// "I am X"
相关文章: