【问题标题】:Javascript OOP inheritanceJavascript OOP 继承
【发布时间】: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 的答案
  • 你永远不会调用你的超级构造函数,HerRoomMyRoom 都不会接受参数。相反,您依靠 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


【解决方案1】:

我想知道我做错了什么导致 $myDoor == $myRoom.door, 但是,$herDoor != $herRoom.door。

仅仅是因为您在初始化 $herDoor 时提供了 var $herDoor = new Door(5);,而 55 分配给了 number 属性。

在构造函数调用中改变值会给你想要的输出

var $herDoor = new Door(10);

抱歉迟到的编辑,您似乎希望在将 Room 的原型分配给 MyRoom 后,将调用 Room 的构造函数。此外,由于您没有将门对象传递给 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);

【讨论】:

  • function(no = 10) 是 es6 功能(默认值)。他可能正在使用转译器。
  • @Magrangs 哦,好的。如果 OP 确认,我会将其从我的帖子中删除
  • @gurvinder372 我尝试更改它,但 $herDoor.number 仍然与 $herRoom.door.number 不同。
  • @Magrangs 不,我没有使用转译器。但是我觉得我的浏览器支持es6。
  • @gurvinder372 进入该函数的门参数始终未定义,因此将始终创建一个门号为 10 的新门。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-21
相关资源
最近更新 更多