簡體   English   中英

ES6 如何覆蓋 toString() 方法?

[英]ES6 how to override toString() method?

在 ES5 樣式的 javascript 中,要覆蓋toString方法,我只需執行以下操作:

function myFunction() {
}

myFunction.prototype.toString = function() {
    return "My amazing function";
};

var myAmazingFunc = new myFunction();
console.log(myAmazingFunc);

在我當前的代碼中,我使用 ES6,我的對象現在是一個類(本質上是一個函數)。

class MyAwesomeClass {
    // awesome code goes here
}

我試圖覆蓋toString方法的方法如下:

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

並且

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

也沒有prototype - 但它似乎仍然沒有被調用。 這在 ES6 類中怎么可能?

這實際上確實有效:

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

您的測試方式一定有問題(提示: console.log不會觸發toString )。

如果您正在尋找一種自定義console.log輸出的方法,這只能在 node.js ( https://nodejs.org/api/util.html#util_custom_inspection_functions_on_objects ) 中通過添加自定義inspect方法來實現。 盡管從節點 10 開始不推薦使用此功能。

console.log()不會為你調用toString()方法......你還需要使用${}

 class MyAwesomeClass { toString() { console.log("toString called"); return "Awesome"; } } let e = new MyAwesomeClass(); console.log(`${e}`);

你是先實例化這個類嗎? 如果我創建一個類:

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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM