我有一个小测试要做,是我的潜在雇主做的。 这是CODE我做的。
雇主的假设: Circle、Window 和 Rectangle 类应该继承某个父类(super class) - 我将其命名为 Shape。
Window 类应该有 getBiggest() 和 getSmallest() 方法 - 第一个应该返回形状具有最大面积的对象(计算后),第二个应该返回最小的对象。
所有类都应该有返回对象 ID 的方法:obj.getId()。
圆形和矩形类应该有方法:
- getPosition() 返回对象位置为 {x:?, y:?} 的 JSON,
- getArea() 返回对象的面积,
- getRadius() 返回由 Circle 类创建的对象半径,
- getWidth() 和 getHeight() 返回 Rectangle 类创建的对象的宽度和高度。
我的代码没有按预期工作。
例如,当我在 Firefox 中运行此代码时,我得到
TypeError: win.getId is not a function _display:167
当点击 _display:167 时,我会被转移到开发者工具调试器,上面写着
{"error": "Please use POST request"}
当我注释掉这个巨大的 console.log() 并放入
console.log("winBiggest: " + winBiggest + "\nwinSmallest: " + winSmallest);
相反,我得到
"winBiggest: undefined _display:167
winSmallest: undefined"
_display:167 还会返回{"error": "Please use POST request"}。
我在这里做错了什么?我对 JS 原型(prototype)和继承很陌生 - 昨天第一次在 Codeschool 类(class)(JavaScript RoadTrip 第 3 部分)上看到它,但只是基础知识。
感谢您最终的回复和帮助。
最佳答案
win
没有方法 getId
,因为您已经注释掉了为 Window
类分配其原型(prototype)的行。它根本不继承自 Shape
。
当你让它正确继承时,它无论如何都不会做你想做的事。在 Shape
构造函数中,您永远不会分配给 id
属性,也永远不会在 getId
中引用 newShapeObj
属性.
在其余的构造函数中请记住这一点,您也不要分配稍后引用的任何属性。 newShapeObj
对解释器来说没有任何意义,它没有理由怀疑您希望将其属性复制到新对象。如果您希望所有子类都具有这种行为,可以将其添加到 Shape
构造函数中:
function Shape(properties) {
Object.keys(properties).forEach(function (propKey) {
this[propKey] = properties[propKey];
}, this);
}
但我不推荐它。相反,选择要分配给对象的属性并从初始化对象中获取它们:
function Shape(properties) {
this.id = properties.id;
}
或者完全处理该对象并将所需的属性作为参数传递:
function Shape(id) {
this.id = id;
}
关于javascript - 在 JavaScript 中努力处理继承和原型(prototype)设计 - 原型(prototype)方法不像 "should"那样工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26150779/