1

我对 JavaScript 继承和原型有一些问题。我在 stackoverflow/google 中所做的所有研究都引导我使用我的类的原型,但这是我想要避免的一点。我现在的 JavaScript 不是这样构思的,但我确信这是可能的,我只是卡住了。

我有两节课(或者以后可能更多)。一个是基础,它将是一切之母,我希望它具有所有基本属性和方法(就像一个基本的 OO)。我的对象用于几何。


    function EnvObject(){
      this.position = {x: 0, y: 0};
      this.velocity = {x: 0, y: 0};
      this.mass = 0; // kg
      this.restitution = 0; // Restitution
      this.A = 0;
      this.Cd = 0; // Drag force

      function init(_x, _y, _mass, _restitution)
      {
        blabla
      };
    };

    function oCircle()
    {
     function foo(){}
     function bar(){}
    }
    function oSquare()
    {
     function foo(){}
     function bar(){}
    }

主类为我的类提供了所有信息,比如正方形或圆形......用原型扩展它会导致大问题和一件好事,方法很好共享(这很酷),但我的属性也是共享的,所以当我在我的 Square 类中更改它,属性也会在 Circle 中更改(这是一件坏事)

我知道主要的解决方案是不提供属性接口,只将它们放在 Square/Circle 类中,但它不是很干净(我的意思是我写了两次或更多相同的属性)。

我的主要目标是创建一个具有 2 个或更多其他类的新类,而不共享任何东西或可能只是几个方法?并最终编写干净的代码?:)

所以我尝试了很多脚本......他们都使用这种技术。或者也许我只是错了,这可能是真的。

我也知道 JS 中不存在该类,它只是一个大功能。像这样写对象更好吗?我倾向于非常喜欢它,因为在我看来使用函数有点混乱。也许以这种方式继承要容易得多?

var envObject = {
    position: {x, y}
}
var oCircle = {
    foo: function(){}
}
4

4 回答 4

1

使用原型对象的新实例:

function oCircle() {
    function Circle() {
        this.foo = function(){};
    }
    Circle.prototype = new EnvObject();
    return new Circle();
};

现在,无论何时调用new oCircle(),都会使用一个新的 EnvObject 实例。这就是您对基于类的继承的期望。

于 2013-01-31T16:33:12.657 回答
1

您可能遇到了嵌套对象( position, velocity) 的问题。您将需要分别为每个不同的实例创建子对象。

我也知道 JS 中不存在该类,它只是一个大功能。像这样写对象更好吗?

不,不是“更好”,只是不同而已。您可以只使用返回普通对象的函数,而不是使用通过调用new和设置属性的构造函数 - 减少混淆。this

也许以这种方式继承要容易得多?

不是 JavaScript 使用的原型继承。此外,您可能想看看这个关于“类”如何在 JavaScript 中工作的答案。

于 2013-01-31T16:35:21.893 回答
0

最好的方法......(我见过)

这是一个很好的起点——我们结合使用构造函数窃取和原型继承 (上面的#ppoliani 指出)

function SuperType() {
    this.super = 'type';
}
SuperType.prototype = { m: function () { } };

function C() {
    SuperType.call(this);
    this.key = 'value';
};
C.prototype = (new (function () {
    $.extend(this, new SuperType());
    this.some = 'thing';
})());

var c = new C();
console.log(c);

然而,这可能需要一些调整——例如,C.prototype对象(使用new以便我们可以使用this——这很好)扩展this了,new SuperType()并且方法被添加到this不是 C.prototype——不好。它还使用了非本机$.extend功能——不好。

当然,大量使用继承可能是一种非常不受欢迎的方法。Complex-Deep-Inheritance-Hierarchies通常会导致Class Architecture中的极端熵。如果您的层次结构很复杂,那么深层架构将成为维护、可移植性和适应性的噩梦。如果是这种情况,请开始实施装饰者模式

这是一个示范性的答案,可以为读者提供更好的工具来操作继承链。

希望这可以帮助。

于 2014-11-07T22:43:10.933 回答
0

您是否尝试过应用原型链接和构造函数窃取的组合?

    function SuperType(){
        this.prop1 = // some value
        this.prop2 = // some other value
    }

    SuperType.prototype.function1 = function(){

    };

    function SubTypeA(){
        SuperType.call(this); // add inherited properties to this instance

        this.subTypeProperty1 = ...
    }

    SubTypeA.prototype = new SuperType();

    SubTypeA.prototype.subTypeFunction1 = function(){

    }

每个子类型都有自己的继承属性。

于 2013-01-31T16:31:50.947 回答