gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:24:06 26 4
gpt4 key购买 nike

考虑以下代码。

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

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

alert( har.var1 );

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

最佳答案

为什么一开始就需要使用对象?非面向对象的语言已经是图灵完备的,因此您可以使用对象完成的所有事情在没有它们的情况下也可以完成。

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

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

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

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

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

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

然而,您可以看到,如果您需要两个计数器,在不使用原型(prototype)的情况下,您将需要复制整个对象定义。这样写和维护起来都比较麻烦,而且每个increment函数都要单独定义,这样也会浪费内存。

也就是说,如果您需要一个您知道只需要其一个实例的对象,那么为其定义构造函数和原型(prototype)是没有意义的。这些对象通常被视为命名空间,而不是实际对象。

附录:字典与对象

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

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

关于javascript - 如果我可以随时向对象插入任何属性,那么在 javascript 中创建类有什么用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11356434/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com