如果我可以随时将任何属性插入对象,那么在javascript中创建类有什么用

What is the use of creating a class in javascript, if I can insert any attritube to an object any time

本文关键字:javascript 创建 什么 我可以 任何 对象 插入 属性 如果      更新时间:2023-09-26

请考虑以下代码。

我创建了一个空对象。并且正在添加var1,var2,var3而不声明它们。

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

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

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

您在示例中显示的内容实际上不是一个对象,而只是一个字典。在这种情况下,您只需要将几个相关属性放在一起,像您正在使用的匿名非原型对象是事实上的标准方法(尽管习惯上使用速记语法初始化它们,例如 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 Object还是var dict = {}, 结果是一样的);因此,在代码中使用的字典也是对象。