检查是不是已分配 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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章