检查toString是否已分配
Checking whether toString has been assigned
我想要一个调试输出函数包含一个测试:如果对象有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"
相关文章:
- 是否可以使用CSS分配数据属性
- 理解Javascript中的“未定义”:它是如何工作的,如何安全地检查它以及是否可以重新分配
- Javascript是否为具有未定义值的变量分配32位内存
- 是否可以将已解析的承诺分配给对象的属性
- 是否分配给内部 HTML 删除 HTML 子树
- 在 JavaScript 中是否可以使用 @“text” 将多行字符串分配给变量,就像在 C# 中一样
- 我们是否可以安全地从套接字参数的回调中分配对象引用
- 检查页面标题是否包含在链接属性中,并使用jQuery分配活动类
- 是否将函数分配给变量的区别
- q 从 .then 函数分配给更高级别的作用域变量是否存在任何陷阱
- 如果我有一个变量,分配给函数调用的值,如果函数调用的参数更改,是否可以更新该变量
- JS/XSS:将用户提供的字符串分配给变量时;替换 <,> 和字符串分隔符是否足够
- 对函数表达式和我分配函数表达式的变量使用相同的标识符是否存在任何问题
- 对象属性的分配顺序是否与声明顺序相同
- 立即调用的属性是否可以引用它所分配到的对象
- 声明函数是否会创建具有函数名称和分配给它的函数对象的变量
- JavaScript - 我想将两条信息分配给一个数组 - 我是否使用多维数组
- jquery $.getJSON 的 JSON 数据是否可以分配给其他变量
- 是否可以在运行依赖项之前在 gulp 任务中分配变量
- 一旦超时执行,清除或重新分配分配给 setTimeout 返回值的变量是否有任何技术点