【发布时间】:2016-06-25 08:10:50
【问题描述】:
我创建了这些对象及其方法。
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。谁能帮我看看我的错误在哪里?
更新:
因为,我创造
var $herDoor = new Door(5);
var $herRoom = new HerRoom($herDoor);
我期望$herRoom.door.number 等于$herDoor.number。因为,
$herDoor instanceof Door // true;
【问题讨论】:
-
你的门牌号码永远是 10 - 看看@gurvinder372 的答案
-
你永远不会调用你的超级构造函数,
HerRoom和MyRoom都不会接受参数。相反,您依靠 wrongly initialised prototype 拥有该属性。 -
看起来好像在创建 HerRoom/MyRoom 的新实例时,它对您进入其中的门没有任何作用。它总是构造一个新的门实例作为它的原型,它的默认值为 10。尝试将两个值都更改为 20,例如,看看 $myRoom.number = 10
-
$myDoor == $myRoom.door- 嗯,没有。它们可能具有相同的编号,但它们不是同一个对象。 -
@DickyBullin $myRoom.door.number 将始终为 10。将您的代码更改为 var $myDoor = new Door(20);你会看到 $myRoom.door.number 将是 10。它总是创建一个新的 Door 作为它的 door 属性(即对你传入 MyRoom 的 $myDoor 没有任何作用。)
标签: javascript oop