【问题标题】:JS prototypes, small confusionJS原型,小困惑
【发布时间】:2014-11-25 22:36:01
【问题描述】:

我是 JavaScript 新手。

我正在编写一个面向对象的程序来查找矩形和正方形的面积。我有三个类——形状、正方形和矩形。我想继承父类-Shape,到子类-Square,遇到了原型相关的问题。代码:

Square.prototype= new Shape();
Square.prototype.__proto__= Shape.prototype;

我想知道:
1. 写Square.prototype= new Shape(); 是否可以将Shape 类继承到Square 类中?
2.线路有什么区别:
Square.prototype.__proto__= Shape.prototype; 导致类 Square。

非常感谢任何帮助,谢谢!

【问题讨论】:

  • 1) 是的。 2) 什么都没有(因为Square.prototype.__proto__ 已经指向Shape.prototype)。但是there are better ways to establish inheritance.
  • 构造一个Shape的实例来为Square定义一个类似乎不纯;你应该如何将参数传递给 Shape 创建?简而言之,感觉比 JS 更像另一种 lang
  • @dandavis:你是对的,这个程序实际上是一个 nodejs 程序,这会改变一切吗?顺便说一句,我打算在原型上为类 Square 添加属性。 Felix 和 Oriol,非常感谢你们的 cmets!
  • fwiw,我发现将方法放在单个对象实例上更容易,然后可以影响我的任何其他实例;为什么每个对象都需要它自己的方法呢?对于诸如 smalltalk 之类的东西是有道理的,但对于像 JS 这样带有 call/bind/apply/defineProperty 的脚本语言则没有那么多。如果数据对象仅包含“自己的属性”,它还可以使序列化和扩展更容易,并且您无需担心继承或重新创建继承以保持状态。因为你不继承数据,它使一切变得干净,而且 V8 使用 objectObjects 比自定义类型更快。

标签: javascript oop


【解决方案1】:

为了你的继承,我宁愿使用:

Square.prototype = Object.create(Shape.prototype);
Square.prototype.constructor = Shape;

出于这些原因:Understanding the difference between Object.create() and new SomeFunction()

Square.prototype.__proto__= Shape.prototype; 不是一个好习惯,因为它会将对象的所有原型链替换为另一个原型。这个操作很慢。此外,__proto__ 属性已弃用,随时可能消失:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 2011-12-18
    相关资源
    最近更新 更多