2015-12-16 4 views
-2

Там, кажется, некоторая путаница по определению экземпляра, ссылка и объект. Может кто-нибудь объяснить разницу между этими тремя в Javascript?Instance против Reference против объекта в Javascript

Чтобы сделать это простым, , пожалуйста, не используйте слово class/classes в вашем ответе. Не говорите о java - давайте держать его в javascript - пожалуйста.

Некоторые говорят, что экземпляр просто ссылка:

«Объекты вещи в памяти, а экземпляры вещей, которые ссылаются на них.»

см: Difference between object and instance

Другие говорят, что объекты являются экземплярами, а затем ссылки are-- для example-- переменную, которая ссылается на этот экземпляр.

См: Difference between reference and instance in javascript

iAmAnObjectInstance = {...object stuff...}; 

    var theReference = iAmAnObjectInstance; 

так, что это?

A. Объекты - это экземпляры. Ссылки ссылаются на экземпляр (объекта).

или

B. примеры приводятся ссылки и ссылки являются экземплярами. Они ссылаются, где объект находится в памяти/коде/программе.

Кроме того, если кто-нибудь знает хороший аннотированный, простой английский ontology для Javascript-терминов, которые помогли бы объяснить их (а не только спецификацию ECMAScript, но, возможно, и полученные из нее), это тоже может быть очень полезно.

+2

Идея, что ссылка является экземпляром объекта, является бессмыслицей. – Pointy

+2

Язык является гибким и не всегда точным. Тем более, что эти термины используются для описания различных языков, а разные программисты имеют с ними различный опыт. – Barmar

+0

Вы не можете использовать слово «экземпляр», не используя слово «класс». – Barmar

ответ

4

В Javascript функция-конструктор и определение прототипа образуют процесс и определение для создания новых объектов с известным набором свойств/методов.

Каждый раз, когда вызывается конструктор, создается новый объект этого типа. Каждый из этих новых объектов, которые создаются, представляет собой экземпляр этого типа объекта. При первом построении он имеет известный набор свойств/методов, которые дают ему известное поведение или набор значений.

Таким образом, это создает новый экземпляр объекта:

var foo = new myConstructor(); 

Каждый раз, когда вы называете этот конструктор, он создает еще один экземпляр этого объекта.

В Javascript ссылка является средством обращения к этому вновь созданному объекту. У вас может быть много ссылок на тот же объект.

Экземпляр - это фактический объект в памяти.

A ссылка - это переменная или аргумент или свойство, которое в настоящее время ссылается или указывает на этот экземпляр.

Поскольку нет прямого доступа ко всем случаях в 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 lingo здесь, просто чтобы сравнить его с известными функциями на других языках, чтобы объяснить, как работает ссылка на Javascript.


Что касается вопросов/ответов, на которые вы ссылаетесь в своем вопросе.

This question you referenced спрашивает:

Иногда я слышу, как люди говорят, «ссылка на объект», а некоторые говорят «а экземпляр объекта» В чем разница?

И выбранный ответ говорит, что это:

переменная будет содержать ссылку на экземпляр объекта.

Фактический объект является экземпляром.

Переменная/переменные, используемые для доступа к объекту, содержат ссылки .

Это в значительной степени то, что я сказал.Я добавил, что ссылка может быть сохранена в свойстве или аргументе, а также в обычной переменной.

The other question you referenced пытается ответить на аналогичный вопрос без учета какого-либо конкретного языка, и это становится намного более проблематичным, поскольку, как вы указали, все термины не означают абсолютно то же самое на каждом компьютерном языке. Таким образом, этот другой вопрос и его ответы концептуально конструктивны, но не специфичны для Javascript и, следовательно, недостаточно для Javascript.

+0

jfriend00 для президента (козырь для VP) –

Смежные вопросы