# OOP's in JavaScript (class, object)

Well first of all you have to acknowledge that JavaScript is the weirdest language ever on earth And most crazy as well And most beautiful at the same time. so **OOP** in javascript is not the same as another language like C++/Java. in ES6 we got `class` keywords. class syntax in javascript it's just a wrapper over function. a class may have only one `constructor`. so we can't use multiple constructors.

```javascript
class Product {
    constructor(name, price) {
        this.name = name;
        this.price = price;
    }
}

let processor = new Product("Intel core i-9", 65000);
let monitor = new Product("LG w49", 35000);

console.log(processor, monitor);
```

The code above does the following:  
We created a class Product with two parameters: name and price. Creates 2 objects of the class. Creates a constructor function for a product object. Accepts two arguments, name, and price, and assigns them to the object properties. Creates a new object and sets the properties name and price to the values passed in. Returns the newly created object.

`this` keyword in javascript is different from java(whenever you create an object, it has a property `this` and `this` points to the same object)/c++/c# `this`.  
in javascript, `this` keyword refers to the calling site (from where the function or class is called).  
whenever you have to access a data member inside a member function we need to access it using `this` keyword.

`new` keyword is not only associated with `class`. it can be used with function also.  
The `new` keyword executes 4 step process:

1. The `new` keyword creates a brand new empty JS object. and `this` is pointing to the object.
    
2. It does a process of linking.
    
3. It calls the function with `this` property assigned to the empty object it created before. the moment it calls the function `this` (everywhere) refers to the same empty object.
    
4. The function execution stats. if the function doesn't return any specific object, then it automatically returns `this`. otherwise, it returns the object returned by you.
