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.json
package.json
npm init
is run
package.json
npm install
is run
package-lock.json
package.json
Use npm --version
to check what version is currently installed and use npm to update itself to the latest version.
npm -v
npm 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 install
function 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.