JavaScript对象和OO/UML/Java对象有什么区别?

11

在标准的面向对象编程中,比如UML定义的和Java、C#实例化的方式,对象被认为是类的实例。那么这种传统概念与JavaScript对象有何不同?

2个回答

17

JavaScript对象与经典的OO/UML(如C++/Java/C#等)对象不同。特别是,它们不需要实例化一个类。它们可以通过方法槽拥有自己的(实例级别的)方法,因此它们不仅具有(普通的)属性槽,还具有方法槽。此外,它们还可以具有键值对槽。因此,它们可能具有三种不同类型的槽,而经典对象(在UML中称为“实例规格”)只具有属性槽。

JavaScript对象可以用于许多不同的方式和不同的目的。以下是五种不同的用例或可能的JavaScript对象含义:

  1. 记录是一组属性槽,例如:

    var myRecord = { firstName:"Tom", lastName:"Smith", age:26}
    
    一个关联数组(或'哈希映射')是一组键值插槽。它支持基于键的查找值,例如,
  2. var numeral2number = { "one":"1", "two":"2", "three":"3"}
    

    将值“1”与键“one”关联,“2”与“two”等。 键不需要是有效的JavaScript标识符,但可以是任何类型的字符串(例如,它可能包含空格)。

  3. 一个未类型化对象不会实例化一个类。 它可能有属性插槽和方法插槽,例如,

    var person1 = {  
      lastName: "Smith",  
      firstName: "Tom",
      getInitials: function () {
        return this.firstName.charAt(0) + this.lastName.charAt(0); 
      }  
    };
    
  4. 命名空间可以通过一个未命名的对象来定义,该对象由一个全局对象变量引用,其名称表示命名空间前缀。例如,以下对象变量提供了基于模型-视图-控制器(MVC)架构范例的应用程序的主要命名空间,其中我们有三个子命名空间对应于MVC应用程序的三个部分:

  5. var myApp = { model:{}, view:{}, ctrl:{} };
    
  6. 通过表达式

    new C()

    创建一个由JavaScript构造函数C定义的类实例化的类型化对象o

  7. var o = new C(...)
    

    通过内省表达式可以检索到这种类型/类的有类型对象

    o.constructor.name  // returns "C"
    

查看我的JavaScript概述,获取更多关于JavaScript对象的信息。


有趣。不过我建议从比较中去掉UML,因为看起来UML并不意味着强类型语言,即使它是设计为基于类的语言,而基于原型的语言也并不与UML不兼容。在这方面考虑一下分类器的定义:“分类器表示根据其特征对实例进行分类”。我认为这并不意味着对象的类是固定的。另外,请参考这个问题https://stackoverflow.com/q/69637013/3723423 - 顺便问一下,你的链接还有效吗? - undefined
但是这里的主要问题不是动态分类(Java和JS都不支持),而是对象的可能性:(a)不实例化任何类,(b)具有方法槽。[JavaScript摘要链接对你有用吗?] - undefined
如果一个对象与任何类别都没有共享特征,它仍然是一个对象。然后原型创建隐式地创建了某种类别,所有这些似乎与UML并不矛盾。- 这个链接显示了一个几乎空白的页面,上面有一个链接指向一个俄语标题的文档。所以我想确保页面在此期间没有被网络抢注。 - undefined
UML不允许创建不实例化类的对象(他们说“CreateObjectAction是一个创建给定分类器直接实例的动作”),而JS允许这样做。不,链接的页面没问题,它包含三个链接:(1)指向一个英文HTML文档,(2)指向一个俄文HTML文档,(3)指向一个PDF文件。 - undefined
有趣的文章,提供了很多有价值的信息。我理解在JS中实例化一个不属于任何类的对象,无论如何都会创建一个Object的实例,根据https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object上的说明:"几乎所有的JavaScript对象都是Object的实例",这似乎使其与CreateObjectAction兼容。 - undefined
它可能在非常弱的意义上与UML“兼容”,即使JS对象没有通过实例化类来创建,它们也会隐式地成为(抽象)顶级类Object的实例。但是,我仍然坚持认为这样的对象在类型上是“无类型”的,因为它没有任何特定的类作为其类型,而任何Java对象都有一个特定的类作为其类型。 - undefined

3

除了上述内容,您还可以添加以下内容:

  1. Javascript对象是可变的(我们可以添加属性),而Java对象是不可变的(我们不能添加属性,但我们可以通过setter更改属性的值)。当我说可变时,意味着可以向Javascript对象添加一些额外的属性。例如:

    var person = { firstName: "John", secondName: "Deer", }

稍后我们可以通过添加其他属性来更改它。比如:

Person.age = 25;

在此步骤之后,Person将变成:

{firstName: "John", secondName: "Deer", age: 25}

而在Java中,无法通过这种实例化对象的方式添加属性。

  1. Javascript对象可以用多种方式实例化

使用字面量

var person = {firstName:"Deen",lastName:"Deer"}

使用新的Javascript对象

var person = new Object();
person.firstName = "John";
erson.lastName = "Deer";

使用函数

function Person(firstName, lastName){
this.firstName = firstName;
this.lastName = lastName;
}

您可以创建一个人对象,如下:

var person = new Person("John","Deer");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接