This code is used to add new books but I don't understand how it really works. I'm seeing a variable books used but was never assigned. How did it come to existence?
<script>
const bookManager = {
addBook: function(book){
if(!this.books){
this.books = [book];
} else{
this.books.push(book);
}
}
};
</script>
bookManager
is an object. addBook
is a method inside the object. The addBook
method when called is checking if the bookManager object have a property called books
. If it does not have the books
then it is creating a books
property in this line this.books = [book];
and adding book
to it. If it has the property then it is pushing the book
to it. Here this
representing the object bookManager
const bookManager = { addBook: function(book) { if (!this.books) { this.books = [book]; } else { this.books.push(book); } } }; bookManager.addBook('test'); console.log(bookManager.books)
this.books
is initialized if it does not exist at: this.books=[book]
. The check if it is empty is done in the if statement at: if(!this.books){}
. It will be falsy the first time. If it exists, the next book
will be pushed into the new array.
The Manager object takes 'book' as argument and adds it to an array which is a property (similar to 'members' in other object-oriented languages). If the array doesn't exist, it creates one and initializes it with 'book' as the first element.
The usage would be
bookManager.addBook("The Swarm")
Result:
console.log(bookManager.books)
Array(1)
["The Swarm"]
The bookManager
object is being defined as an object literal (a string literal would be book = "Moby Dick"
)
As Objects contain methods, this one contains an addBook
method which will add the book to the books
property (optionally, creating the array with the added book if the books
property does not exist).
The following code shows the structure of the object and the books
property once the code is run:
const bookManager = { addBook: function(book) { if (!this.books) { this.books = [book]; } else { this.books.push(book); } } }; bookManager.addBook("Moby Dick"); console.log(JSON.stringify(bookManager)); console.log(bookManager.books);
bookManager
is an object that contains a function called addBook
. This function accepts a prop called book
. this.books
is creating a variable inside the function( addBook
) that is only useable only in that function. There is also an if statement that adds book or books to this.books
. If this.books is false
then this.books will be an array of the given prop( book
), and if this.books is true
, then it will add the book to the this.books . Later, you can access the this.books that this
is referring to the object name which is bookManager
.
const bookManager = { addBook: function(book) { if (!this.books) { this.books = [book]; } else { this.books.push(book); } } }; bookManager.addBook('Harry Potter'); console.log(bookManager.books);
Let's Check it step by step:
first you have a javascript object named bookManager.
const bookManager = {}
inside the object you have a function called addBook
which takes book
as a parameter.
inside the function, existence of this.books which this
refers to addBook
function is checked. in this code it's always going to be false so the code inside if (!this.books) {}
will always run and would assign an array with initial value of book
to this.books
. in this code example the else
block would never run but if you modify your code to have this.books
initialized early, like this :
const bookManager = {
addBook: function (book) {
this.books = ['testi']
if (!this.books) {
this.books = [book];
} else {
this.books.push(book);
}
}
};
bookManager.addBook('tast');
console.log(bookManager.books)
then the else
block would run instead of if
block and as now there already is a this.books
, new book would be pushed with Array.push()
method.
Basically how this works step by step: First, we define the variable bookManager
which is an object.
const bookManager = {}
Inside of the definition line there is this code:
const bookManager = {
addBook: function (book) {
if (!this.books) {
this.books = [book];
} else {
this.books.push(book);
}
},
};
Inside of the bookManager object we have an addBook
function. Inside of the addBook
function we can see that it basically does two things:
bookManager
( this
) has a books
value.Array.push()
to add a new item to the end of the array (which is book
)this.books
with the first item being the parameter book
. Now you've noticed that there is now a new variable bookManager.books
in the bookManager
object. This is because when in the function we say this
it means bookManager
in this case. So that means that the line this.books
means bookManager.books
. The new variable this.books
gets added to the bookManager object.
Now, to test this we can run the following code:
bookManager.addBook("hello, world");
console.log(bookManager.books);
In the console an array with the only item being "hello, world"
will be logged.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.