检查是不是已分配 toString [重复]

Posted

技术标签:

【中文标题】检查是不是已分配 toString [重复]【英文标题】:Checking whether toString has been assigned [duplicate]检查是否已分配 toString [重复] 【发布时间】:2015-08-11 07:54:12 【问题描述】:

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

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

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

【问题讨论】:

给它起一个不是默认函数的名字?或者分配一个属性来检查对象? 【参考方案1】:

类似的东西 obj.hasOwnProperty('toString')

【讨论】:

【参考方案2】:
var x = 
if (!(x.hasOwnProperty("toString"))) 
  x.toString = function() 
    return "I am X"
  

x.toString()
// "I am X"

【讨论】:

【参考方案3】:

可以查看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

【讨论】:

【参考方案4】:

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

【讨论】:

代码是正确的.. A 没有toString 它的原型对象有..

以上是关于检查是不是已分配 toString [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Bash条件表达式(-v)检查是不是设置了变量[重复]

检查是不是已安装程序[重复]

检查图像是不是已完全加载[重复]

检查数据库是不是已填充[重复]

检查按钮是不是已滑过,并检查其标签? (iOS)[重复]

operator new 如何知道内存已分配[重复]