检查是否已分配toString

时间:2015-05-28 17:00:09

标签: javascript

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

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

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

4 个答案:

答案 0 :(得分:3)

等等 obj.hasOwnProperty('toString')

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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

请参阅Check if an object has a user defined prototype?

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

答案 3 :(得分:0)

var x = {}
if (!(x.hasOwnProperty("toString"))) {
  x.toString = function() {
    return "I am X"
  }
}
x.toString()
// "I am X"