1

考虑下面的代码。

我创建了一个空对象。并且在var1,var2,var3没有声明的情况下添加。

var har = new Object();
har.var1 = "Var1";
har.var2 = "Var1";
har.var3 = "Var1";

alert( har.var1 );

如果我可以做到这一点,那么当我可以随时引入新属性时,为什么我需要创建一个类并修复属性?

4

1 回答 1

2

为什么你甚至需要首先使用对象?非面向对象的语言已经是图灵完备的,所以你可以用对象完成的所有事情,你也可以不用它们来完成。

您在示例中显示的并不是真正的对象,而只是字典。在这种情况下,您只需要将几个相关的属性放在一起,匿名非原型对象(如您正在使用的对象)是事实上的标准方法(尽管习惯上使用速记语法初始化它们,例如var har = {})。它一个对象,因为它使用对象数据结构,但它不是面向对象的。

相比之下,实际对象不仅定义数据,还定义您可以对该数据执行的操作。对象不仅具有属性,而且还具有处理这些属性的方法。这些属性通常在对象原型中定义(您称之为“类”,但 Javascript 不是基于类的语言,而是基于原型的语言)。原型中定义的所有方法都在该原型的所有实例之间共享。

function Counter() {
    this.counter = 0;
}

Counter.prototype.increment = function() {
    this.counter++;
    alert(this.counter);
}

var c1 = new Counter();
var c2 = new Counter();

c1.increment(); // alerts 1
c1.increment(); // alerts 2
c2.increment(); // independent from c1: alerts 1 again

每个实例仍然是一个字典,就像在您的示例中一样(您甚至可以向它们添加更多属性,它们不是通过具有构造函数和原型来“修复”的),但现在它也可以对其属性执行任务。这也可以按照您的方式完成:

c1 = {
    counter: 0,
    increment: function() {
        this.counter++;
        alert(this.counter);
    }
}

c2 = {
    counter: 0,
    increment: function() {
        this.counter++;
        alert(this.counter);
    }
}

但是,您可以看到,如果您需要两个计数器,而不使用原型,您将需要复制整个对象定义。这样写和维护起来会很麻烦,而且每个increment函数都要单独定义,也会浪费内存。

也就是说,如果你需要一个你知道你只需要一个实例的对象,那么为它定义一个构造函数和一个原型是没有意义的。此类对象通常被视为名称空间而不是实际对象。

附录:字典与对象

字典是保存命名元素的数据结构。除了“字典”之外,它们也被称为关联数组哈希图。Javascript 中的对象被实现为字典——每个属性都是字典中的一个命名元素。除了一个普通的字典,对象还有一个原型,它有点像一个对象——当你在字典中查找一个命名元素并且它不存在时,它也会自动在原型中搜索。这样,默认属性和方法在原型中只定义一次,不需要复制到每个实例中。(一个对象的原型通常是可见的instance.__proto__属性,尽管这是非标准的,即使在支持它的浏览器中也不推荐使用;实际原型被标准定义为内部的、不可访问的属性)

因此,Javascript 对象实际上是字典。当你想使用一个普通的字典来存储一些相关的属性时,Javascript 中没有单独的语法来创建一个不是对象的字典,所以你创建一个基Object类型的实例来保存你的字典(没关系如果你做var dict = new Objector var dict = {},结果是一样的);因此,您在代码中使用的字典也是对象。

于 2012-07-06T05:54:10.993 回答