javascript - 在 JavaScript 中努力处理继承和原型(prototype)设计 - 原型(prototype)方法不像 "should"那样工作

标签 javascript object inheritance prototype

我有一个小测试要做,是我的潜在雇主做的。 这是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/

相关文章:

vba - 在 VBA 中实现接口(interface)的类模块中的其他方法

javascript - 在javascript中从平面数组构建树数组

javascript - 从 vuex 状态数组中创建计算属性数组以在 v-model 中使用

类和数据的Android生命周期,Object,Application,BroadcastReceiver

android - getParcelableExtra 在 Pending Intent 上总是 null,但不是 Intent

Java 泛型 : override method that differs in parameterized return type

java - 子类构造函数是否从父类(super class)构造函数继承变量?

javascript - 更改 map 中的标记

javascript - 杀死 nestjs - node.js 进程丢失 redis 连接(微服务)

javascript - 删除/更新 Node.js 中的 JSON key