Explain the purpose of the package.json file and node_modules directory.
package.json specifies which packages we want to use within the app as well as semantic versioning ranges to say what versions of that app are acceptable
package-lock.json specifies the exact version of the package that we have installed in our node_modules directory, where we got that package from, and dependencies of that package
node_modules is a directory that contains all of the actual code for packages that we have added to our project
Given multiple choices, identify the difference between npm’s package.json and package-lock.json files.
package-lock.jsonpackage.jsonnpm init is run
package.jsonnpm install is run
package-lock.jsonpackage.jsonUse npm --version to check what version is currently installed and use npm to update itself to the latest version.
npm -vnpm install -g npm@latest
-g tells us to add as a global package@latest says to install the latest versionUse npm init to create a new package and npm install to add a package as a dependency. Then use require to import the module and utilize it in a JavaScript file.
npm init creates our package.jsonnpm install moment adds the moment package as a dependencyconst moment = require('moment'); imports the module into our code so that we can use the moment variable and call any methods on it that exist in the module;
moment.().format('dddd'); for examplenpm install --save-dev nodemon adds the nodemon package as a dev dependencyGiven an existing GitHub repository, clone the repo and use npm to install it’s dependencies.
git clone <repo-url>npm installfunction Book(title, series, author) {
  this.title = title;
  this.series = series;
  this.author = author;
}prototype of a constructor function.Book.prototype.getInformation = function () {
  if (this.series) {
    return `${this.title} (${this.series})`;
  } else {
    return this.title;
  }
}class Book {
  constructor(title, series, author) {
    this.title = title;
    this.series = series;
    this.author = author;
  }
}class Book {
  // constructor
  getInformation() {
    if (this.series) {
      return `${this.title} (${this.series})`;
    } else {
      return this.title;
    }
  }
}class Book {
  // constructor
  static getUniqueAuthors(...books) {
    let authors = [];
    books.forEach(book => {
      if (!authors.includes(book.author)) {
        authors.push(book.author)
      }
    })
    return authors;
  }
}new keyword.super keyword in a child class to inherit from a parent class.class CatalogItem {
  constructor(title, series) {
    this.title = title;
    this.series = series;
  }
  getInformation() {
    if (this.series) {
      return `${this.title} (${this.series})`;
    } else {
      return this.title;
    }
  }
}
class Book extends CatalogItem {
  constructor(title, series, author) {
    super(title, series);
    this.author = author;
  }
}
class Movie extends CatalogItem {
  constructor(title, series, director) {
    super(title, series);
    this.director = director;
  }
  // extending the functionality of the parent's getInformation()
  getInformation() {
    let result = super.getInformation();
    if (this.director) {
      result += ` [directed by ${this.director}]`;
    }
    return result;
  }
}Utilize module.exports and require to import and export functions and class from one file to another.
// book.js
const CatalogItem = require('./catalog-item');
class Book extends CatalogItem {
  // Book code
}
module.exports = Book- In this next example, we are exporting a multiple items from a file. We are assigning an object to module.exports that contains each item we are exporting. When we import from this file, we can either import the whole object, or destructure right in our import
// classes.js
class CatalogItem {
  // CatalogItem code
}
class Book extends CatalogItem {
  // Book code
}
class Movie extends CatalogItem {
  // Movie code
}
module.exports = { Book, Movie}// index.js
const classes = require('./classes');
const Movie = classes.Movie;
const Book = classes.Book;
// Or, destructuring in the import statment:
// const { Movie, Book } = require('./classes');
const theGrapesOfWrath = new Book('The Grapes of Wrath', null, 'John Steinbeck');
const aNewHope = new Movie('Episode 4: A New Hope', 'Star Wars', 'George Lucas');The three pillars of object-oriented programming
Encapsulation:
game.getTokenAt(col, row) function in the Connect 4 ProjectInheritance:
Prototypal Inheritance.
this property references the object that the call originally came from.Polymorphism:
as if it were an instance of one of its parent classes.The SOLID principles
Open-Close Principle (less applicable)
How to apply the Law of Demeter
game.getTokenAt(col, row) in Connect 4 projectWorking with objects that come from code you didn’t create
Visualizations of our program (UI has to know about the structure of our data)
module.exports = ClassName, module.exports = { ClassName }, or exports.ClassName = ClassName for exporting. Know the differences and how to use each.const ClassName = require('./file/path') or const { ClassName } = require('./file/path') for importing. Know the differences and how to use each.