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

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

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

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

【问题讨论】:

  • 给它起一个不是默认函数的名字?或者分配一个属性来检查对象?

标签: javascript


【解决方案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 它的原型对象有..
        猜你喜欢
        • 2014-05-17
        • 2010-12-07
        • 2012-02-05
        • 2017-11-17
        • 2020-07-10
        • 2020-04-04
        • 2021-09-29
        • 2012-09-06
        • 2019-12-14
        相关资源
        最近更新 更多