代码之家  ›  专栏  ›  技术社区  ›  developer82

ES6如何重写toString()方法?

  •  2
  • developer82  · 技术社区  · 6 年前

    在ES5样式的javascript中,重写 toString 方法I只需执行以下操作:

    function myFunction() {
    }
    
    myFunction.prototype.toString = function() {
        return "My amazing function";
    };
    
    var myAmazingFunc = new myFunction();
    console.log(myAmazingFunc);
    

    在我当前的代码中,我使用ES6,我的对象现在是一个类(本质上是一个函数)。

    class MyAwesomeClass {
        // awesome code goes here
    }
    

    托斯特林

    class MyAwesomeClass {
        toString() {
            return "Awesome";
        }
    }
    

    class MyAwesomeClass {
        // awesome code goes here
    }
    MyAwesomeClass.prototype.toString = function() {
        return "Awesome";
    };
    

    同样没有 prototype -但它似乎仍然没有被称为。 在ES6课堂上这怎么可能?

    2 回复  |  直到 6 年前
        1
  •  12
  •   georg    6 年前

    这确实有效:

    class MyAwesomeClass {
      toString() {
        console.log("toString called");
        return "Awesome";
      }
    }
    
    console.log(new MyAwesomeClass() + "!!!");

    你的测试方式肯定有问题(提示: console.log 不会触发 toString ).

    控制台.log 输出,这只能在node.js中实现( https://nodejs.org/api/util.html#util_custom_inspection_functions_on_objects ),通过添加自定义 inspect 方法。尽管从节点10开始,此功能已被弃用。

        2
  •  1
  •   Erick Zetinator    4 年前

    console.log() 不会打电话给 toString() ${}

    class MyAwesomeClass {
      toString() {
        console.log("toString called");
        return "Awesome";
      }
    }
    
    let e = new MyAwesomeClass();
    console.log(`${e}`);
        3
  •  0
  •   stewartmcgown    6 年前

    你是先实例化这个类吗?如果我创建一个类:

    class myclass {}

    添加一个原型,甚至只是标准的方式:

    myclass.prototype.toString = () => "hi"
    // or, using the class syntax
    class myclass {
        toString() {
           return "hi"
        }
    }
    

    然后我可以实例化这个类,它可以工作:

    new myclass().toString()
    > "hi"
    

    也许您正试图在静态的、未实例化的类本身上调用它。为此,需要向类中添加一个静态方法。

    class myclass {
        static toString() {
            return "myclass toString"
        }
    }
    

    因此,在类的非实例化版本上调用此函数时,将得到重写的方法:

    myclass.toString()
    > "myclass toString"