2015-10-31 75 views
1

有時候你以爲你知道的東西,然後把它原來你真的不知道......的JavaScript模塊模式不給予正確的instanceof

我已經做了很多的研究,JavaScript的繼承了最近幾天,我正在給當地一家技術集團發表演講。沒問題我想,我知道這個東西,我只是刷了...

原來,我還有很多東西要學。這是第一件讓我感到驚訝的事情:

function Vehicle() { 
    function move() { 
     console.log('moving'); 
    } 
    return {move: move} 
} 

function OtherVehicle() { 
    this.alsoMove = function() { 
     console.log('also moving') 
    } 
} 

第一種方法是我一直理解的模塊模式。第二,雖然我不知道它的名字,但我明白它基本上是相同的 - 只是一個小的語法變體。

除外:

(new Vehicle()) instanceof Vehicle \\ returns false 
(new OtherVehicle()) instanceof OtherVehicle \\ returns true 

new Vehicle()返回一個 '對象'。
看着這個,這是有道理的,但這不是我所期待的。 任何人都可以解釋這裏發生了什麼,爲什麼,也許指向我一個真正的好資源,進入這個膽量?

作爲後續。

var Car = function() { 
    function drive() { console.log('driving') }; 
    return {drive: drive} 
} 

Car.prototype = new Vehicle() //I know, Object.create preferred 

(new Car).move() //undefined 

// However... 
var Car = function() { 
    this.drive = function() { console.log('driving') }; 
} 

Car.prototype = new Vehicle(); 
(new Car()).move() //output 'moving' 

那麼,模塊模式不能用於繼承?
或者我今天剛剛從牀的錯誤位置醒來,應該在我下一次觸摸鍵盤之前進行一次運行?

回答

3

我不知道有什麼特別好的resource,但是這裏有一些反饋。

new Vehicle()返回一個'Object'。

return {},覆蓋默認返回值this,其實例化對象。調用new這樣的函數是毫無意義的,因爲this被丟棄。就OOP語言而言,JavaScript有點奇怪,因爲它允許您在構造函數中爲this返回另一個值。

所以,是的,繼承使用這種方式是行不通的:{}本身是不以任何方式鏈接到父/基類,這就是爲什麼

(新車).move()// undefined

未定義。

+0

謝謝。這是絕對有道理的。仍然覺得這些年來我一直在做錯事。不過,無論如何,繼承的構成,對吧? ;-) – JonRed

+0

你打賭:-)(我是DI粉絲)。我知道你的意思 - 在使用它幾十年後(我絕不是專家),我仍然經常學習關於JavaScript的新東西。特別是現在NodeJS變得流行起來,它真的被剝奪了。 – Kenney