对于实例,引用和对象的定义似乎存在一些混淆。有人可以在Javascript中解释这三者之间的区别吗?
为简单起见,请不要在答案中使用单词class / classes 。 不要谈论java - 请让它保持javascript--请。
有人说一个实例只是一个参考:
"对象是内存中的东西,而实例是引用它们的东西。"
请参阅:Difference between object and instance
其他说对象是实例,然后引用 - 例如 - 引用该实例的变量。
请参阅:Difference between reference and instance in javascript
iAmAnObjectInstance = {...object stuff...};
var theReference = iAmAnObjectInstance;
所以,这是什么?
一个。对象是实例。引用引用(对象的)实例。
或
B中。实例是引用,引用是实例。它们引用了对象在内存/代码/程序中的位置。
此外,如果有人知道一个好的注释,简单的英语ontology的Javascript术语,这将有助于解释这些(不仅仅是ECMAScript规范,但可能从中得出),这也可能非常有用。 / p>
答案 0 :(得分:5)
在Javascript中,构造函数和原型定义形成了一个过程和定义,用于使用一组已知的属性/方法创建新对象。
每次调用构造函数时,都会创建该类型的新对象。创建的这些新对象中的每一个都是此类对象的实例。首次构造时,它具有一组已知的属性/方法,这些属性/方法为其提供已知行为或一组值。
因此,这会创建一个对象的新实例:
var foo = new myConstructor();
每次调用该构造函数时,它都会创建该对象的另一个实例。
在Javascript中,引用是引用新创建的对象的一种方法。您可能有许多对同一对象的引用。
实例是内存中的实际对象。
引用是当前引用或指向该实例的某个变量或参数或属性。
由于Javascript中无法直接访问所有实例,因此必须始终使用引用才能访问它。事实上,这就是Javascript垃圾收集的工作原理。当实时可到达代码中不再引用任何对象时,该对象的实例就有资格进行垃圾收集,并且可以被处理掉。
您使用引用来访问该对象。
var test0 = new myConstructor();
var test1 = test0;
var test2 = test0;
var test3 = test2;
在Javascript中,上述所有四个变量都包含对同一个新创建对象的引用。对于那些熟悉其他语言的人来说,在这种情况下,Javascript中的引用更像是指针而不是其他语言可能称之为引用的引用。您可以使用该引用来修改一个公共对象:
var test0 = new myConstructor();
var test1 = test0;
test0.myProp = "something"
test1.myProp = "whatever";
console.log(test0.myProp); // "whatever"
console.log(test1.myProp); // "whatever"
console.log(test0 === test1); // true
test0
和test1
都引用同一个对象,因此在任一变量中修改属性或调用对象引用上的方法都会在完全相同的对象上运行。
在Javascript上下文中使用术语引用时,它与C ++上下文中的术语不同。例如,如果您指定给变量test0
:
var test0 = new myConstructor();
var test1 = test0;
test0 = {greeting: "hello"};
这只是将不同的对象引用放入test0
,并且对test0
用来引用的对象或test1
当前引用的对象完全没有影响。这就是为什么我说Javascript中的对象引用更像是指针而不是其他语言中的引用。我不打算在这里发明任何Javascript术语,只是将其与其他语言中的已知功能进行比较,以解释Javascript引用的工作原理。
至于你在问题中引用的问题/答案。
This question you referenced问道:
有时我会听到人们说“对象的引用”,有些人说“a 对象的实例“有什么区别?
选定的答案说明了这一点:
变量将保存对象实例的引用。
实际对象是一个实例。
用于访问对象的变量/变量包含引用 它。
这也是我所说的。我补充说,引用可以存储在属性或参数以及常规变量中。
The other question you referenced试图回答一个类似的问题而不考虑任何特定的语言,这会变得更加成问题,因为正如你所指出的那样,所有术语并不代表每种计算机语言中完全相同的东西。所以,其他问题及其答案在概念上是建设性的,但不是Javascript特有的,因此对于Javascript来说还不够。