Unit 2-Lesson 6: Objects
A javascript object has properties associated with it. A property of an object can be explainedd as a variable that is attached to the object. Object properties are basically the same as ordinary JS variables, except for the attachement to objects. The properties of an object define the characeteristics of the object. You access the properties of an object with a simple dot-notation.
objectname.propertyName
You can define a property by assigning it a value.
var myCar = new Object();
myCar.make = 'Ford';
myCar.model = 'Mustang';
myCar.year = 1969;
Unassigned properties of an object are undefined and not null.
myCar.color;//undefined
Accessing properties using a bracket notation
myCar['make'] = 'Ford';
myCar['model'] = 'Mustang';
myCar['year'] = 1969;
Object property names
//four variables are created and assigned in a single go, separated by commas
var myObj = new Object();
str = 'myString',
rand = math.random(),
obj = new Object();
myObj.type = 'Dot syntax';
myObj['date created'] = 'Strong with space';
myObj[str] = 'Strong value';
myObj[rand] = 'Random Number';
myObj[obj] = 'Object';
myObj[''] = 'Even an empty string';
console.log(myObj);
Take this object literal:
const users = {
user1: {
age: 44,
name: 'picard',
},
user2: {
age: 12,
name: 'sisko',
},
user3: {
age: 109,
name: 'janeway',
},
}
if you want to filter for all users older than 30 and store their data in an array you can do this instead of using a for
loop:
const userKeys = Object.keys(users);
const adults = userKeys
.filter(key => users[key].age > 30)
.map(id => ({id, ...users[key] }));
console.log(adults);
Object.keys(yourObject);
Problem: figure out how to get the number keys in an object. To solve this prolbem and get the total number of keys or length, add .length
after .keys()
It will look like this:
Object.keys(yourObject).length;
Get the total amount of keys in this object:
myObject = {
item1: 'This',
item2: 'is a',
item3: 'Test'
}
console.log(Object.keys(myObject).length);// 3
var arr = [1, true, "gone"]
var obj = {
'name': 'briana',
'food': 'cheese',
'dog': 'maurice'
};
Array has square * brackets * and can hold anything, including another array or object. Objects start with curly brackets and * key value pairs *. This notation is known as * JSON *.
JavaScript is an object oriented language and this means that most things in Js are Objects. Functions are objects. The only elements that are not objects are the Primitive Data Types: * strings * numbers * null * boolean * undefined
These Primitive Data Types also are #immutable#, which means that once created they cannot be modified.
One of the differences between the two is that Primitive Data Types are passed By Value and *Objects* are passed By Reference. What does this mean?
By Value means creating a COPY of the original. Picture it like twins: they are born exactly the same, but the first twin doesn't lose a leg when the second twin loses a leg.
By Reference means creating an ALIAS to the original. When your Mom calls you 'pumpkin pie' even though your name is "John', this doesn't suddenly give birth to a clone of yourself: you are still one, but you can be called by these two very different names.
#1 Assigning a value with the =operator to Primitives as Objects.
var name = 'carlos';
// a variable 'name' is created with a value of 'carlos' and memory is allocated for it
var firstName = name;
//a variable 'firstName' is created and is given a copy of name
value. firstName
has its own memory spot and is indep. of name
. At this moment in the code, firstName
also has a value of carlos
.
name = 'carla';
//We then change the value of name to carla
. But firstname
still holds its original value, because it lives in a different memory spot.
console.log(name);
//carla
console.log(firstName);
// carlos
#2 With Objects, =operator works by Reference.
var myName = {
firstName: 'carlos'
};
var identity = myName;
myName.firstName = 'carla';
console.log(myName.firstName);//'carla'
console.log(identity.firstName);//'carla
Whats happening? A variable 'myName' is created and is given the value of an object which has a property called 'firstName'. 'firstName' has the value of 'carlos'. Javascript allocates a memory spot for 'myName and the object it contains.
A variable 'identity' is created and is pointed to 'myName. There is no dedicated memory space to 'identity' value. It only points to 'myName's value.
We change the value of 'myName' 'firstName' property to 'carla' instead of 'carlos'.
When we log "myName.firstName" it desplays the new value, which is pretty straightforward. But when we log "identity.firstName" it also displays "myName.firstName" new value "carla". This happens because "identity.firstName" only points to myName.firstName" place in the memory.
Unit 2-Lesson 6-Assignment 4: Deeper into Objects (object.keys)
Object.keys()
returns an array whose elements are strings corresponding to the enumerable properties found directly upon object. The ordering of the properties is the same as that given by looping over the properties of the object manually.
better example
var arr = ['a', 'b', 'c'];
console.log(Object.keys(arr));// ['0', '1', '2']
//array like object
var obj = {0; 'a', 1: 'b', 2: 'c'};
console.log(Object.keys(obj));//['0', '1', '2']
//array like object with random key ordering
var anObj = {100; 'a', 2: 'b', 7: 'c'};
console.log(Object.keys(anObj));//['2', '7', '100']
//getFoo is property which isn't enumerable
var myObj = Object.create({}, {
getFoo: {
value: function () {return this.foo;}
}
});
myObj.foo = 1;
console.log(Object.keys(myObj));//console: ['foo']
If you want all properties, even not enumerable, see Object.getOwnPropertyNames()
const pageViewCounts = {
homePage: 399,
aboutPage: 400,
termsOfService: 22
};
console.log(Object.keys(pageViewCounts));
Object.keys(pageViewCounts).forEach(key =>
console.log(
`The ${key} page has ${pageViewCounts[key]} views.`)
);//["homePage", "aboutPage", "termsOfService"] "The homePage page has 399 views." "The aboutPage page has 400 views." "The termsOfService page has 22 views."/
Write Preview
Leave a comment Attach files by dragging & dropping, Choose Files selecting them, or pasting from the clipboard. Styling with Markdown is supported Comment Contact GitHub API Training Shop Blog About © 2017 GitHub, Inc. Terms Privacy Security Status Help
A bluepring for an object can be made by using a function that acts as a constructor function for the objects. You can also create an object literal that will result in a single object that you can't duplicate.
To create a literal object you make a variable that holds a group of comma separated key-value pairs, also called a hash, in which the keys are the names that refer to the values. Each key-value pair is a property of the Object. Values can be data or functions. The example below is an object literal that has 4 properties: name, age, gender, and runner.
var person = {
name: "todd",
age: 31,
gender: 'male',
runner: 'true'
}
An * Object Literal * is a single object. You can't make more versions of this object like you can in other languages when you make a class and create object instances of that class. To do that in JavaScript you need to create a constructor function that acts as a blueprint to create one or more instancesof that object.
Make assignments to the function using the 'this' keyword. Whereas above we created a literal object called Person that can't be duplicated to create multiple Person's, now we will create a constructor function that will allow us to create as many Person objects as we want.
function Person(name, age, gender, runner) {
this.name = name;
this.age = age;
this.gender = gender;
this.runner = runner;
}
```
Now we can create multiplle instances of Person
```
var todd = new Person('todd', 31, 'male', true);
var joe = new Person('joe', 21, 'male', fales);
var julia = new Person('julia', 29, 'female', true);
```
#### what happens when you don't give the correct number of arguments to the constructor function: ####
var malcolm = new Person('malcolm', 23);
var jay = new Person('jay', 55, 'male', false, 'extraArgument');
console.log(malcolm.gender);// undefined
console.log(jay.runner);// undefined
Any arguements you don't include will be initialized as *undefined*. If you give the constructor function to many arguments the extra arguments just won't do anything. In the above example there is no way to access the 'extraArgument' string.
You can also set default values on your object properties in the constructor function in case
The three common ways to create new objects in JavaScript are as follows:
var newObject = {};
// or
var newObject = Object.create( Object.prototype );
// or
var newObject = new Object();
newObject.someKey = "Hello World";
// Get properties
var value = newObject.someKey;
// 2. Square bracket syntax
// Set properties
newObject["someKey"] = "Hello World";
// Get properties
var value = newObject["someKey"];
// Set properties
Object.defineProperty( newObject, "someKey", {
value: "for more control of the property's behavior",
writable: true,
enumerable: true,
configurable: true
});
var defineProp = function ( obj, key, value ){
var config = {
value: value,
writable: true,
enumerable: true,
configurable: true
};
Object.defineProperty( obj, key, config );
};
var person = Object.create( Object.prototype );
defineProp( person, "car", "Delorean" );
defineProp( person, "dateOfBirth", "1981" );
defineProp( person, "hasBeard", false );
console.log(person);
// Outputs: Object {car: "Delorean", dateOfBirth: "1981", hasBeard: false}
Set properties
Object.defineProperties( newObject, {
"someKey": {
value: "Hello World",
writable: true
},
"anotherKey": {
value: "Foo bar",
writable: false
}
});
var myCar = new Object();
myCar.make = 'Ford';
myCar.model = 'Mustang';
myCar.year = 1969;
myCar.color; // undefined
myCar['make'] = 'Ford';
myCar['model'] = 'Mustang';
myCar['year'] = 1969;
var myObj = new Object(),
str = 'myString',
rand = Math.random(),
obj = new Object();
myObj.type = 'Dot syntax';
myObj['date created'] = 'String with space';
myObj[str] = 'String value';
myObj[rand] = 'Random Number';
myObj[obj] = 'Object';
myObj[''] = 'Even an empty string';
console.log(myObj);
var propertyName = 'make';
myCar[propertyName] = 'Ford';
propertyName = 'model';
myCar[propertyName] = 'Mustang';
function showProps(obj, objName) {
var result = '';
for (var i in obj) {
// obj.hasOwnProperty() is used to filter out properties from the object's prototype chain
if (obj.hasOwnProperty(i)) {
result += objName + '.' + i + ' = ' + obj[i] + '\n';
}
}
return result;
}
myCar.make = Ford
myCar.model = Mustang
myCar.year = 1969
for...in loops This method traverses all enumerable properties of an object and its prototype chain
Object.keys(o) This method returns an array with all the own (not in the prototype chain) enumerable properties' names ("keys") of an object o.
Object.getOwnPropertyNames(o) This method returns an array containing all own properties' names (enumerable or not) of an object o.
When you create an object with curly brackets, it's called an object literal
.
var car = {
wheels: 4,
engine: 1,
seats: 4
};
Each key is followed by a colon (:)
. Each key/value pair is separated by a comma (,)
.
JavaScript has a number of predefined objects. In addition, you can create your own objects. You can create an object using an object initializer. Alternatively, you can first create a constructor function and then instantiate an object invoking that function in conjunction with the new operator.
The syntax for an object using an object initializer is:
var obj = { property_1: value_1, // property_# may be an identifier...
2: value_2, // or a number...
// ...,
'property n': value_n }; // or a string
The following statement creates an object and assigns it to the variable x if and only if the expression cond is true:
if (cond) var x = {greeting: 'hi there'};
The following example creates myHonda
with three properties. Note that the engine property is also an object with its own properties.
var myHonda = {color: 'red', wheels: 4, engine: {cylinders: 4, size: 2.2}};
Alternatively, you can create an object with these two steps:
Define the object type by writing a constructor function. There is a strong convention, with good reason, to use a capital initial letter.
Create an instance of the object with new. To define an object type, create a function for the object type that specifies its name, properties, and methods. For example, suppose you want to create an object type for cars. You want this type of object to be called car, and you want it to have properties for make, model, and year. To do this, you would write the following function:
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
Notice the use of this to assign values to the object's properties based on the values passed to the function.
Now you can create an object called mycar as follows:
var mycar = new Car('Eagle', 'Talon TSi', 1993);
This statement creates mycar and assigns it the specified values for its properties. Then the value of mycar.make is the string "Eagle", mycar.year is the integer 1993, and so on.
You can create any number of car objects by calls to new. For example,
var kenscar = new Car('Nissan', '300ZX', 1992);
var vpgscar = new Car('Mazda', 'Miata', 1990);
An object can have a property that is itself another object. For example, suppose you define an object called person as follows:
function Person(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
and then instantiate two new person objects as follows:
var rand = new Person('Rand McKinnon', 33, 'M');
var ken = new Person('Ken Jones', 39, 'M');
Then, you can rewrite the definition of car to include an owner property that takes a person object, as follows:
function Car(make, model, year, owner) {
this.make = make;
this.model = model;
this.year = year;
this.owner = owner;
}
To instantiate the new objects, you then use the following:
var car1 = new Car('Eagle', 'Talon TSi', 1993, rand);
var car2 = new Car('Nissan', '300ZX', 1992, ken);
Notice that instead of passing a literal string or integer value when creating the new objects, the above statements pass the objects rand and ken as the arguments for the owners. Then if you want to find out the name of the owner of car2, you can access the following property:
car2.owner.name
Note that you can always add a property to a previously defined object. For example, the statement
car1.color = 'black';
adds a property color to car1, and assigns it a value of "black." However, this does not affect any other objects. To add the new property to all objects of the same type, you have to add the property to the definition of the car object type.
Objects can also be created using the Object.create() method. This method can be very useful, because it allows you to choose the prototype object for the object you want to create, without having to define a constructor function.
// Animal properties and method encapsulation
var Animal = {
type: 'Invertebrates', // Default value of properties
displayType: function() { // Method which will display type of Animal
console.log(this.type);
}
};
// Create new animal type called animal1
var animal1 = Object.create(Animal);
animal1.displayType(); // Output:Invertebrates
// Create new animal type called Fishes
var fish = Object.create(Animal);
fish.type = 'Fishes';
fish.displayType(); // Output:Fishes
objectName[key] = value
newObject[name]='Mark Brown'
newObject['position']=?
objectName.key = value
newObject.employer = ?
Notice that the keys in the example above are **not enclosed in quotation marks**. This is the default way of indicating keys in an object literal, but **there are times where you need to use quotation marks**. For instance if you need a *space* or *period* in a key, you'd need to use quotation marks around the key:
```javascript
const ledZeppelin2 = {
'lead singer': 'Robert Plant',
'lead guitar': 'Jimmy Page',
}
```javascript
When an object has a value that is a function, we refer to that key/value pair as a method. Here's an example of an object representing a mammal, that features an evolve method.
```javascript
const mammal = {
numEyes: 2,
warmBlooded: true,
evolve: function() {
console.log("I'm not mutating, I'm evolving.");
mammal.numEyes ++;
}
}
console.log(`mammal has ${mammal.numEyes} eyes`);// mammal has 2 eyes
mammal.evolve();//I'm not mutating, i'm evolving.
console.log(`mammal has ${mammal.numEyes} eyes`);//mammal has 3 eyes
Getting values and running methods
Once the object is created, you can get values and run object methods in one of two ways: dot notation ( ledZeppelin.singer
) or with bracket notation (ledZeppelin2['lead singer']
). Using the example objects from above, both ledZeppelin.singer
and ledZeppelin2['lead singer']
would return the value 'Robert Plant'
. Usually we ****use dot notation
to get values from an object, but if you need to get a key with spaces or periods, you must use bracket notation
.****
The same syntax is used to run methods on an object. In the mammal example above, we use dot notation to call the evolve method.
Note that just like functions outside of objects, an object method can take arguments.
const simpleCalculator = {
add: function(a, b) {
return a+b;
}
};
simpleCalculator.add(1, 1); // => 2
Define and create a single object, with the keyword new
var car = new Object();
Define an object constructor, and then *create objects of the constructed type
var car = function(wheels, seats, engine){
this.wheels = wheels;
this.seats = seats;
this.engine = engine;
};
Choosing between an object and an array gets much easier when you can determine the purpose of each structure. Arrays closely fit the way that #books# store information. And objects fit the way that #newspapers# store information.
Arrays Order of Data is Most Important
var book = ['foreward', 'boyWhoLived', 'vanishingGlass', 'lettersFromNoOne', 'afterword'];
book[0] //'foreward'
Ojects: Data Label is Most Important
var newspaper = {
sports: 'Arod Hits Home Run',
business: 'GE stocks plunge',
movies: 'Star Wars is a flog',
}
newspaper['business']
|| newspaper.business
Combining Objects and Arrays
What if you wanted to also store the number of pages in each chapter? it might be best to now fill your array with objects, like this:
var book = [
{name:'foreward', pageCount: 14},
{name:'boyWhoLived', pageCount: 18},
{name:'vanishingGlass', pageCount: 13},
{name:'lettersFromNoOne', pageCount: 17},
{name:'afterword', pageCount: 19}
];
This maintains the order of our chapters and now we have the ability to name specific properties of each chapter.
book[1]['pageCount']