对实例,引用和对象的定义似乎存在一些混淆.有人可以在Javascript中解释这三者之间的区别吗?
为简单起见,请不要在答案中使用单词class/classes.不要谈论java - 让它保持javascript--请.
有人说实例只是一个参考:
"对象是内存中的东西,而实例是引用它们的东西."
看:对象和实例之间的区别
其他人说对象是实例,然后引用 - 例如 - 引用该实例的变量.
请参阅:javascript中引用和实例之间的区别
iAmAnObjectInstance = {...object stuff...}; var theReference = iAmAnObjectInstance;
那么,这是什么?
A.对象是实例.引用是指(对象的)实例.
要么
B.实例是引用,引用是实例.它们引用对象在内存/代码/程序中的位置.
此外,如果有人知道一个很好的注释,简单的英语本体的Javascript术语,这将有助于解释这些(不仅是ECMAScript规范,但可能从它衍生而来),这也可能非常有用.
在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引用的工作原理.
至于你在问题中引用的问题/答案.
您引用的这个问题是:
有时我会听到人们说"对象的引用",有些人说"对象的实例"有什么区别?
选定的答案说:
变量将保存对对象实例的引用.
实际对象是一个实例.
用于访问对象的变量/变量保存对它的引用.
这也是我所说的.我补充说,引用可以存储在属性或参数以及常规变量中.
您引用的另一个问题试图回答类似的问题,而不考虑任何特定的语言,这会变得更加成问题,因为正如您所指出的那样,所有术语并不意味着每种计算机语言都完全相同.所以,其他问题及其答案在概念上是建设性的,但不是特定于Javascript,因此对Javascript来说是不够的.