Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript面向对象继承_Javascript_Oop - Fatal编程技术网

Javascript面向对象继承

Javascript面向对象继承,javascript,oop,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'; } MyRo

我创建了这些对象及其方法

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!=$她的房间。门
。谁能帮我注意一下我的错误在哪里吗

更新:

因为,我创造了

var $herDoor = new Door(5);
var $herRoom = new HerRoom($herDoor);
我希望
$herRoom.door.number
等于
$herDoor.number
。既然

$herDoor instanceof Door // true;
我想知道我做错了什么,使得$myDoor==$myRoom.door, 但是,$herDoor!=$她的房间。门

仅仅因为你给了
var$herDoor=newdoor(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);

你的门牌号永远都是10-看看@gurvinder372的答案,你从来没有调用过你的超级构造函数,
HerRoom
MyRoom
都不需要争论。相反,您依赖于来拥有该属性。在创建HerRoom/MyRoom的新实例时,它似乎与您进入的门没有任何关系。它总是构造一个新的门实例作为其原型,其默认值为10。例如,尝试将这两个值都更改为20,看看$myRoom.number=10
$myDoor==$myRoom.door
-嗯,不。它们可能有相同的数字,但它们不是相同的对象。@DickyBullin$myRoom.door.number将始终为10。将代码更改为var$myDoor=newdoor(20);你会看到$myRoom.door.number是10。它总是创建一个新的门作为它的门属性(即对传递到MyRoom的$myDoor不做任何操作。)函数(no=10)是es6功能(默认值)。“他可能在用运输工具。”马格朗斯:好的。如果OP确认,我会将其从我的post@gurvinder372我试图更改它,但$herDoor.number仍然与$herRoom.door.number不同。@Magrangs不,我没有使用transpiler。但我认为我的浏览器支持es6。@gurvinder372进入该函数的门参数始终未定义,因此将始终创建门编号为10的新门。