【发布时间】:2014-02-24 22:13:19
【问题描述】:
在标准 OO 中,由 UML 定义并实例化,例如,由 Java 和 C#,有一个对象作为类实例的特定概念。这个经典的对象概念和 JavaScript 对象有什么区别?
【问题讨论】:
标签: java javascript oop uml
在标准 OO 中,由 UML 定义并实例化,例如,由 Java 和 C#,有一个对象作为类实例的特定概念。这个经典的对象概念和 JavaScript 对象有什么区别?
【问题讨论】:
标签: java javascript oop uml
JavaScript 对象不同于经典的 OO/UML(C++/Java/C# 等)对象。特别是,它们不需要实例化类。并且它们可以有自己的(实例级)方法,以方法槽的形式,所以它们不仅有(普通的)属性槽,还有 方法槽。此外,它们还可能具有键值槽。因此,它们可能具有三种不同的槽,而经典对象(在 UML 中称为“实例规范”)只有属性槽。
JavaScript 对象可以以多种不同的方式用于不同的目的。以下是 JavaScript 对象的五种不同用例或可能的含义:
record 是一组属性槽,例如,
var myRecord = { firstName:"Tom", lastName:"Smith", age:26}
关联数组(或“哈希映射”)是一组键值槽。它支持基于 keys 的 values 查找,例如,
var numeral2number = { "one":"1", "two":"2", "three":"3"}
将值“1”与键“one”、“2”与“two”等相关联。键不必是有效的 JavaScript 标识符,但可以是任何类型的字符串(例如,它可能包含空白空格)。
无类型对象不实例化类。它可能有属性槽和方法槽,例如,
var person1 = {
lastName: "Smith",
firstName: "Tom",
getInitials: function () {
return this.firstName.charAt(0) + this.lastName.charAt(0);
}
};
命名空间可以定义为由全局对象变量引用的无类型对象的形式,其名称代表命名空间前缀。例如,以下对象变量提供了基于模型-视图-控制器 (MVC) 架构范例的应用程序的主命名空间,其中我们有对应于 MVC 应用程序的三个部分的三个子命名空间:
var myApp = { model:{}, view:{}, ctrl:{} };
类型化对象 o 实例化由 JavaScript 构造函数 C 定义的类,是使用表达式创建的
var o = new C(...)
这种类型化对象的类型/类可以用内省表达式检索
o.constructor.name // returns "C"
有关 JavaScript 对象的更多信息,请参阅我的 JavaScript Sumary。
【讨论】:
除了以上内容,您还可以添加以下几点:
Javascript 对象是可变的(我们可以添加属性),而 Java 对象是不可变的(我们不能添加属性,但我们可以通过设置器更改属性的值)。当我说可变的时候,可以向 Javascript 对象添加一些额外的属性。举个例子吧。
var person =
{
firstName: "John",
secondName: "Deer",
}
稍后我们可以通过添加其他属性来更改它。说
Person.age = 25;
这一步之后Person会变成
{firstName: "John", secondName: "Deer", age: 25}
在 Java 的情况下,这种向实例化对象添加属性的方式是不可能的。
使用文字
var person = {firstName:"Deen",lastName:"Deer"}
使用 Javascripts 新建对象
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");
【讨论】: