2016-03-10 146 views
2

我創建了這些對象及其方法。Javascript OOP繼承

var Door = function(no = 10) { 
    this.number = isNaN(no) ? 10 : no; 
} 

var Room = function(door) { 
    this.door = door instanceof Door ? door : new Door(); 
    this.name = 'Room'; 
} 

function MyRoom(){ 
    this.name = 'MyRoom'; 
} 
MyRoom.prototype = new Room(); 

function HerRoom() { 
    this.name = 'HerRoom'; 
} 
HerRoom.prototype = new Room(); 

var $myDoor = new Door(10); 
var $herDoor = new Door(5); 

var $myRoom = new MyRoom($myDoor); 
var $herRoom = new HerRoom($herDoor); 

console.log($myDoor, $myRoom.door); 
// $myDoor.number is 10 
// $myRoom.door.number is 10 

console.log($herDoor, $herRoom.door); 
// $herDoor.number is 5 
// $herRoom.door.number is 10 

我不知道我做錯了什麼,讓$myDoor == $myRoom.door$herDoor != $herRoom.door。任何人都可以幫助我注意我的錯誤在哪裏?

更新:

因爲,我創建

​​

我期待那$herRoom.door.number等於$herDoor.number。因爲,

$herDoor instanceof Door // true; 
+1

你doornumbers永遠是10 - 看看@ gurvinder372 – messerbill

+2

你永遠叫你的超級構造函數的答案,也不'HerRoom'也不'MyRoom'取一個論點。相反,你依靠[錯誤初始化的原型](https://stackoverflow.com/questions/12592913/what-is-the-reason-to-use-the-new-keyword-here)擁有該屬性。 – Bergi

+0

看起來好像在創建HerRoom/MyRoom的新實例時,它不會對您傳入的門執行任何操作。它總是構造一個門的新實例,用作其原型的默認值爲10.嘗試將兩個值都更改爲20,例如$ myRoom.number = 10 – Magrangs

回答

2

我不知道我做錯了什麼,讓$ myDoor == $ myRoom.door, 但是$ herDoor!= $ herRoom.door。

很簡單,因爲你給了var $herDoor = new Door(5);在初始化$herDoor其分配給5財產number

改變構造函數調用的值會給你你想要

var $herDoor = new Door(10); 

道歉後期編輯輸出,似乎你都希望分配房間,以MyRoom的原型後,房間的構造函數將被調用。另外,由於您沒有將門對象傳遞給MyRoom,它永遠不會獲得此對象。

你需要做以下更改

function Door (no) { 
    this.number = isNaN(no) ? 10 : no; 
} 

function Room (door) { 
    this.door = door instanceof Door ? door : new Door(); 
    this.name = 'Room'; 
} 

function MyRoom(door){ 
    this.name = 'MyRoom'; Room.call(this, door); //door object is passed and Room constructor is invoked with it 
} 
MyRoom.prototype = Object.create(Room.prototype); 
function HerRoom(door) { 
    this.name = 'HerRoom'; Room.call(this, door);//door object is passed and Room constructor is invoked with it 
} 
HerRoom.prototype = Object.create(Room.prototype); 

var $myDoor = new Door(10); 
var $herDoor = new Door(5); 

var $myRoom = new MyRoom($myDoor); 
var $herRoom = new HerRoom($herDoor); 

console.log($myDoor, $myRoom.door); 
console.log($herDoor, $herRoom.door); 
+1

函數(no = 10)是es6的功能(默認值)。他可能正在使用轉譯器。 – Magrangs

+0

@Magrangs哦,好的。如果OP確認它,我會從我的帖子中刪除它 – gurvinder372

+0

@ gurvinder372我試圖改變它,但$ herDoor.number仍然不是$ herRoom.door.number。 –