Javascript原型(prototype)继承

标签 javascript inheritance

我正在通过遇到的一个问题来试验 Javascript 继承的几个方面:

创建预订飞机座位或酒店房间的预订系统。它对飞机或酒店的特定部分收取不同的费用。例如,头等舱的费用将高于教练。酒店房间有顶层套房,价格更高。跟踪房间何时可用并可以安排。

我正在处理酒店房间问题。

我决定使用一个房间基础对象,它有一个名为“duration”的数据成员,用于跟踪房间预订的天数,以及两种方法:book 和 checkout。

我有一个继承自 SingleRoom 的派生对象“SingleRoom”。

代码如下:

    function Room(duration){
    this.duration = duration;
}
Room.prototype.book = ()=>{
    if (this.prototype.count > 0){
        this.prototype.count -= 1;
        return true;
    }
    else {
        return false;
    }
}

Room.prototype.checkOut = ()=>{
    this.prototype.count += 1;
    console.log("Room checked out");
}

function SingleRoom(duration){
    this.price = 1000;
}
SingleRoom.prototype = new Room();
SingleRoom.prototype.constructor = SingleRoom;
SingleRoom.prototype.count = 3;
var sr1 = new SingleRoom(2);
if(sr1.book() === false){
    console.log("Could not book room");
}

我在“this.prototype.count”处收到以下错误:无法读取未定义的属性计数

知道问题出在哪里吗?

谢谢!

最佳答案

您应该只在构造函数上使用 prototype 属性。这是正确的:

SingleRoom.prototype = new Room();
SingleRoom.prototype.constructor = SingleRoom;
SingleRoom.prototype.count = 3;

但是你不应该在单个对象上使用它。当您访问未在直接对象上定义的属性时,会自动搜索原型(prototype)链。将 this.prototype.count 更改为 this.count 即可正常工作。

关于Javascript原型(prototype)继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37489020/

相关文章:

javascript - 为什么 WCF 服务无法在托管服务器上运行?

c# - 在继承自基页的页面上查找控件

c++ - 通用树类的继承

javascript - 如何使用 jQuery 替换文本区域中的特定元素?

javascript - 我可以在用户操作后隐藏 YouTube 视频吗?

javascript - 如何在从下拉列表中选择选项时显示确认弹出窗口

c++ - SFML 在实现绘制函数时从派生类转换不明确

c++ - 从具有相同基类的另一个派生类调用派生类的非常量方法

c++ - 无法从具有虚拟继承的类派生(C++ 虚拟继承)

javascript - OnSubmit Javascript 不覆盖提交操作