我想调试输出函数包含一个测试:如果对象有一个toString函数,请使用它。
但是,每个JavaScript对象都有一个toString函数,所以我真正想要的是检查它是否已经被赋值给了String,而不仅仅是继承了一个默认的。
最好的方法是什么?它发生在我身上,也许你可以利用继承函数在for-in迭代中不可见的事实,尽管感觉应该有一个O(1)解决方案。
答案 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"