2017-01-26 5 views
0

Это мой первый вопрос, поэтому приношу свои извинения, если я пропустил что-либо. Возможно, решение для моей проблемы можно найти, но я понятия не имею, как его искать, никаких подсказок о том, как его спросить в Google или что-то в этом роде.Конструктор и аргументы Javascript

У меня следующая проблема, давайте иметь такой конструктор

const Product = function (color) { 
    let self = {}; 

self.setColor = function(colorToSet) { 
    color = colorToSet; 
} 

self.getColor = function() { 
    return color; 
} 

return self; 
}; 

теперь, когда я пытался использовать:

let self = {}, color; 

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

скажем, я напишу что-то вроде этого:

let a = Product("Yello"); 
a.getColor() ----> "Yellow" 
a.setColor("red"); 
a.getColor() ----> "red"; 

Если она возвращает цвет в первый раз, то он должен быть объявлен как-то. Я не знаю, где цветовое поле, я не могу найти его в объекте или в его прототипе, нигде на самом деле. Не могли бы вы объяснить мне, почему? и где он?

Я знаю, что могу просто объявить цвет, например: self.color = color; Но я хочу знать, как работает пример выше и что произошло с полем цвета.

Также вы могли бы рассказать мне, могу ли я использовать let с объявлением значений из параметров таким образом?

const Product = function (color) { 
let self = {}, color; 

self.setColor = function(colorToSet) { 
    color = colorToSet; 
} 

self.getColor = function() { 
    return color; 
} 

return self; 
}; 
+0

Afaik, если вы используете только 'color', он добавляется к объекту' window'. Вы фактически получаете/устанавливаете 'window.color'. –

+0

@Chris G: цвет не определяется на 'window', это ** закрытие ** поведения – Pineda

ответ

0

Это не магия :) это поведение происходит потому, что:

Вы возвращаете объект, имеющий два метода, которые closures.

Если функция определена внутри другой функции, а затем ссылка на это хранится где-то (в данном случае, когда вы вернулись прикрепляют к переменной self), то closure создается.

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

В результате он будет иметь доступ к любым переменным в охватывающей области во время вызова родителя.

Сюда входят любые параметры этой прилагаемой функции продукта, то есть аргумент color, который вы определяете.

Итак:

  • вы вызываете продукт, проходящий в цвете и хранить это в переменной a. В этой точке будет содержать ссылку на объект, свойство которого включает в себя два метода getColor и setColor

  • , поскольку последние методы закрытие, они имеют доступ к их области видимости в момент время продукта (их функция вшита среда была названа) ,Так как продукт был вызван с цветом, переменный называются color локального по отношению к продукту, но также любых закрытиям будет создана и присвоены значения, переданных в. В этом случае color будет равен «Желтыми

  • Так как методы были определены в одном и том же объеме одновременно, оба они имеют доступ к этой переменной, производя результаты, которые вы испытали.

0

Он должен быть объявлен как-то. Я не знаю, где цветовое поле, я не могу найти его в объекте или в его прототипе, нигде на самом деле. Не могли бы вы объяснить мне, почему? и где он?

Это переменная, которую вы указали, используя ее как имя параметра. Эта переменная параметра привязана к функции Product, то есть может использоваться в любом месте внутри нее. Это причина, по которой вы получаете «уже объявленную» ошибку, если пытаетесь использовать let color.

Ваши методы могут получить доступ (чтение/запись) этой локальной переменной, поскольку они являются closures.

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