2016-08-28 5 views
2

Итак, используя Академию Кодекса, я нахожусь в разделе «Объекты» учебника Javascript, и мне очень тяжело обворачивать мой мозг. Функции & Объекты. Мне нужна помощь и объяснение с помощью приведенных ниже частей кода. Я прокомментировал каждую строку, в чем мне нужна помощь. Большое спасибо заранее.Справка по Javascript: Функции/Объекты

// Obviously declaring the Rabbit function with adjective to be called 

function Rabbit(adjective) { 

    // I don't understand this line, or the context of why this is being used. 

    this.adjective = adjective; 

    // Why declare another function here? Is a function within a function 
    // considered a Method or is that only Function within an Object? 

    this.describeMyself = function() { 

    // I get this part but why does it need a function to do this? 

    console.log("I am a " + this.adjective + " rabbit"); 
    }; 
} 

// I don't get this either, Isn't this declaring a new object? How can 
// that be when you only have a Function named Rabbit? 

var rabbit1 = new Rabbit("fluffy"); 
var rabbit2 = new Rabbit("happy"); 
var rabbit3 = new Rabbit("sleepy"); 

// How could this work if describeMyself is in the Rabbit function and 
// has nothing to do with rabit1? 

console.log(rabbit1.describeMyself); 
console.log(rabbit2.describeMyself); 
console.log(rabbit3.describeMyself); 

Надеюсь, не слишком запутанным, но если кто из вас более опытные люди Javascript любезно объяснить все, о которой я говорил в комментариях я очень ценю это. Благодаря

+1

«Метод» в языках программирования обычно является функцией, прикрепленной как свойство или дочерний элемент объекта (но спецификация EMCAScript, которая определяет JavaScript, никогда не использует слово «метод» для описания какой-либо особенности языка, а просто общая слово). В целом, на это обычно отвечает [JavaScript: как работает «новый» внутри) (https://stackoverflow.com/questions/6750880/javascript-how-does-new-work-internally), хотя ответы там могут возьмите на себя сильную команду языка. Короткий ответ 'new' вызывает функцию с вновь созданным объектом' this'. – apsillers

+0

Обратите внимание, что ваш курс учит методу, который все еще работает, но который, как правило, [считается замененным] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes) последним версия Javascript. Но если у вас есть опыт работы с любым современным языком ООП (C++, Ruby, Java), должно быть достаточно легко найти параллели с их представлениями о классах, методах и т. Д. Но следует предупредить, что основной механизм (прототипное делегирование) существенно отличается , –

+0

Чтобы исправить мой предыдущий комментарий: spec действительно * does * явно определяет «метод» как «функцию, которая является значением свойства». (Я ошибочно считал, что это не дает такого определения для этой категории функций.) – apsillers

ответ

1
  1. Rabbit является конструктор, который производит экземпляр при вызове с new ключевого слова.
  2. Когда вы это сделаете, this указывает на экземпляр, который вы создали.

Так, по var rabbit1 = new Rabbit('fluffy'), вы создали объект выглядит как-то так и присвоить переменной rabbit1:

{ 
    adjective: 'fluffy', 
    describeMyself: function() {...} 
} 

Как this в rabbit1.describeMyself указывает на самого экземпляра (rabbit1), когда вы звоните rabbit1.describeMyself(), this.adjective действительно дает вам rabbit1.adjective. Вот почему вы получаете 'fluffy'.

Для rabbit2 и rabbit3, this указывает на себя соответственно.

+0

Я бы посоветовал вам прочитать книгу начального уровня. Перекрестные темы очень распространены при изучении языка программирования, онлайн-серия обычно не может хорошо справляться с такими ситуациями. – Leo

+0

Кроме того, ** любая ** функция может использоваться как конструктор, просто с помощью 'var something = new myFunction()'. По соглашению функции конструктора капитализируются, чтобы отличать их. –

+0

@ScottSauyet 'new' любая функция не была бы весьма значимой, если она не была составлена ​​в целях конструктора. Но да, вы все равно могли бы «новым» :) – Leo

0

Я думаю, что критическая вещь, которая помогла мне понять JavaScript, была осознанием того, что функции JavaScript являются объектов.

Объект JavaScript может содержать функцию как одно из значений массива или как значение более глубокого объекта.

Итак, в вашем вопросе о this.adjective, вы храните переданным в (с внешней стороны) adjective внутри сферы function Rabbit, которая становится Rabbit.adjective к большему внешнему области. Если вы не установили его в свойство Rabbit, тогда Rabbit.adjective был бы undefined при закрытии большей внешней области, но был бы доступен для чего-либо внутри Rabbit.

console.log (rabbit1.describeMyself); // Как это могло бы работать, если описать себя в функции Кролика и не имеет ничего общего с rabit1?

В этом случае rabbit1 унаследовал свойство Rabbit пути первого экземпляра (создано) от прототипа (вроде как родитель, что вы всегда можете копировать из, но не можете скопировать обратно - так по значению), так что он имеет все те же свойства, что и Rabbit, но с различными данными, вводимыми из линии new.Таким образом, вы можете использовать Rabbit внутри rabbit1, не загрязняя Rabbit и будучи в состоянии настроить Rabbit, имея как можно больше экземпляров Rabbit (Rabbit1, Rabbit2 и т. Д.), Как вы хотите.

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

+0

Полагаю, я хорошо понимаю, что происходит в коде, но это объяснение меня озадачивает. Во-первых, тот факт, что функции фактически являются объектами, не имеет к этому никакого отношения. Если бы они не разделяли иерархию, все было бы одинаково. И хотя, да, есть прототипы, которые следует учитывать (отсутствует в ответе Лео выше), это не объясняет их, и я думаю, что OP, вероятно, должен пройти до запуска. –

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