Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于javascript的UML?_Javascript_Uml_Object Diagram - Fatal编程技术网

用于javascript的UML?

用于javascript的UML?,javascript,uml,object-diagram,Javascript,Uml,Object Diagram,我正在寻找一种以图形方式表示javascript对象的方法 我知道有UML,但例如,如何表示两个对象之间的链,例如: var a, b; a = {}; b = Object.create(a); 直觉上,我会画这样的东西: +-----+ |b | |-----| | | +--+--+ | +-----+ +---->|a | |-----| | | +-----+ 但是在UML

我正在寻找一种以图形方式表示javascript对象的方法

我知道有UML,但例如,如何表示两个对象之间的链,例如:

var a, b;

a = {};
b = Object.create(a);
直觉上,我会画这样的东西:

+-----+
|b    |
|-----|
|     |
+--+--+
   |     +-----+
   +---->|a    |
         |-----|
         |     |
         +-----+
但是在UML中有一个合适的表示吗

那么混合呢

c = $.extend({}, a, b)

+-----+           +-----+
|a    |           |b    |
|-----|           |-----|
|     |<----------|     |
+-----+           +-----+
   +     +-----+
   |     |c    |
   |     |-----|
   +---->|     |
         +-----+
c=$.extend({},a,b)
+-----+           +-----+
|a | | b|
|-----|           |-----|
|     ||     |
+-----+

看起来您正试图在类图中显示对象实例之间的关系。这是行不通的;您可能想尝试使用UML实例图(也可以称为对象图)。类图旨在以静态方式捕获系统概念、它们的结构和它们之间的关系。从类图开始,然后移动到实例图,在其中可以在对象实例的“插槽”或属性中插入一些值,以查看类图中的模型是否工作。

首先需要知道的是JavaScript使用的是什么。这意味着类和实例之间没有其他OO语言(如Java)中的区别。只有物体。其中一个含义是,区分和是没有意义的

对于您的第一个示例:

var a, b;

a = {};
b = Object.create(a);
这是继承-对象
b
继承对象
a
的属性

在UML中对此进行建模的正确方法是以下类/对象图:

混合可以看作是多重继承的一种形式,对象
c
从对象
a
b
继承属性,其图表可能如下所示:

+-----+
|b    |
|-----|
|     |
+--+--+
   |     +-----+
   +---->|a    |
         |-----|
         |     |
         +-----+

您的示例代表的是对象之间的关系,而不是类之间的关系,因此UML对象图是一条出路(正如RobertMS已经指出的那样)

这些对象相互关联的意义在于(在第一种情况下)对象
a
是对象
b
的原型。我会使用一个依赖关系。Wikipedia对UML依赖关系表示法有很好的描述

使用依赖项的基本原理是,它反映了“对影响或独立建模元素的更改可能会影响依赖建模元素的语义”这一概念。因为我们经常使用原型对象来保存“依赖”对象集合(即相同对象的对象)的默认属性和方法“类”),这种依赖关系的使用似乎是合理的,如果不是有点争议的话

我会用构造型“”标记依赖项

UML确实给了您很大的灵活性,尽管遵循惯例很好

有一个很好的处理对象图上


在您的第二个示例中,使用jQuery的
extend
函数,您没有真正的原型关系,但您正在将一些对象的属性合并到另一个对象中。在这种情况下,我不确定是否有一个特定的总体建模术语。不过,这里有一种依赖关系。我建议粗略列出标准的UML依赖性原型(在上面提到的Wikipedia页面上列出)然后看看在您的特定应用程序中是否有任何意义。也许对您有用?

为什么不使用继承?我认为它更适合这种情况,因为继承表明两个对象之间的关系比依赖关系更密切。我会忽略您不应该使用类图,UML不是用原型bas设计的记住继承。如果OP的例子不同,我会使用UML继承JS,例如一个带有原型的形状向量和一个圆形向量,其原型链接到Shape.prototype!但是OP只显示了单个对象,从来没有显示任何对我来说像子类化的东西。我所能看到的只是从oth派生的对象er对象。如果有的话,在第一个示例中,它更像是
a
是“类型”,而
b
是“实例”(这就是
Object.create
的用法).没有子类化。不过,我同意你的观点,我们应该利用UML的灵活性,在必要的时候忽略一些事情。只使用
Object.create
进行继承是相当不错的。我认为继承是更好的方法的另一个原因是,Object
a
中的任何属性都是“继承的”通过
b
,它们成为b的接口的一部分。您的方法是强调原型链接。如果您想向某人解释原型链和属性查找是如何工作的,这可能没问题。但在我看来,这并不是一个常见的场景。最后,这取决于图表的目标受众:-)当然,足够公平了。JavaScript中传统的UML继承链接没有任何问题,因为您当然可以用原型模拟接口继承。无论普通与否,我阅读OP的问题的方式(对我来说,这似乎很清楚!)是它问的“如何表示对象之间的特定关系?也许这个问题的目的是别的,谁知道呢。显然,如果目标受众要使用一个高级模型,那么类图就可以了。不完全准确的是,对象和它的类之间没有区别。至少从理论上看不是这样。任何对象都具有给定的类型。具有相同原型的任何对象都派生自相同的类型,具有相同原型和相同对象属性的任何对象都具有相同的类型。因此,您可以拥有并且确实可能拥有比类型更多的对象。然而,这并没有使你的观点无效:)从技术上来说,更正确的说法是JavaScript中没有类的表示。让我向阅读本文的其他人说明,ECMAScript 2015现在包含类,并且不会偏离prototype-b