我正在上課,我注意到在檢查狀態后我看到了控制臺日志,但之后我看到了undefined. 誰能解釋如何解決這個問題以及為什么會發生這種情況?
class Test {
constructor(name) {
this.name = name;
}
status() {
console.log("test")
}
}
class Test1 extends Test {
constructor(name) {
super(name);
}
checkStatus() {
super.status();
}
}
const b = new Test1("Test")
console.log(b.checkStatus())
uj5u.com熱心網友回復:
Console.log 有什么作用?
該方法console.log不回傳值。這似乎是一個常見的誤解,人們似乎認為它會將列印的內容回傳到日志中。
但是,即使這是一個假設,status()也沒有明確的回報,所以值為undefined.
函式與箭頭函式
這里又出現了一個誤解,那就是常規函式和箭頭函式之間的區別。箭頭函式有一個方便之處,即如果函式體決議為一個值,則將其作為回傳值。考慮:
function foo() {
return 'foo'
}
console.log(foo()) // foo() returns 'foo', so the log shows 'foo'
const bar = () => 'bar'
console.log(bar()) // bar() returns 'bar', so the log shows 'bar'
const baz = () => console.log('baz')
console.log(baz()) // baz() returns undefined, so the log shows 'baz' and 'undefined'
用于super
checkStatus() {
super.status();
}
你super在這里使用沒有(好的)理由。 status()繼承自class Test,可以用 呼叫this.status()。super.status()只有在提供覆寫Test1并需要呼叫父類實作時才需要使用。
我懷疑這實際上是您的意圖,但是由于缺乏return陳述,您試圖了解在哪里被稱為什么并偏離了方向。
修訂代碼
在這里,我重命名了這些類以使事情更清楚一些。
TestBase提供我們的基類功能。
TestOverride提供了一個覆寫實作,status它將自己的名稱添加到由回傳的值之前TestBase.status,稱為 via super(this.super()這里將創建一個無限回圈)。
TestNoOverride不添加任何內容TestBase,因此回傳值與 per 一樣TestBase(但請注意,它使用的是傳遞給建構式的名稱。
這里最重要的教訓是,如果您希望能夠從函式分配(或記錄)回傳值,則必須提供明確的回傳值。例外情況是,如果函式是一個箭頭函式,其函式主體為簡單陳述句,在這種情況下,箭頭函式將該值作為(隱式)回傳。
class TestBase {
constructor(name) {
this.name = name;
}
status() {
return "TestBase " this.name
}
}
class TestOverride extends TestBase {
constructor(name) {
super(name);
}
status() {
return "TestOverride " super.status();
}
}
class TestNoOverride extends TestBase {
constructor(name) {
super(name);
}
}
const a = new TestBase("A")
console.log(a.status())
const b = new TestOverride("B")
console.log(b.status())
const c = new TestNoOverride("C")
console.log(c.status())
uj5u.com熱心網友回復:
您正在記錄回傳的值b.checkStatus(),undefined因為該函式不回傳值。您很可能不希望記錄此回傳值。
class Test {
constructor(name) {
this.name = name;
}
status() {
console.log("test")
}
}
class Test1 extends Test {
constructor(name) {
super(name);
}
checkStatus() {
super.status();
}
}
const b = new Test1("Test")
b.checkStatus()
uj5u.com熱心網友回復:
考慮這一行:
console.log(b.checkStatus())
這checkStatus()在Test1類中運行,該類status()在測驗中運行。好吧,考慮一下status():
console.log("test")
好的,“測驗”列印到控制臺。現在,由于沒有回傳函式,undefined是隱式回傳的。checkStatus()因此回傳這個值,undefined。然后你用console.log(b.checkStatus()), 列印記錄這個undefined。
如果你仔細看,你console.log()的程式中有兩個 s。因此有兩個輸出,第二個是undefined。
uj5u.com熱心網友回復:
發生這種情況是因為您的checkStatus方法沒有回傳任何內容。
就像你在做一樣
function hello(){
console.log('hello')
}
console.log(hello())
如果你想讓你的函式回傳一些東西,你可以在父方法和checkStatus方法中回傳一些東西
class Test {
constructor(name) {
this.name = name;
}
status() {
return "test"
}
}
class Test1 extends Test {
constructor(name) {
super(name);
}
checkStatus() {
return super.status();
}
}
const b = new Test1("Test")
console.log(b.checkStatus())
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/485767.html
標籤:javascript
上一篇:簡單卡號驗證成表格LUHN演算法
下一篇:下拉選單在div內或動態不起作用
