Skip to content

Instantly share code, notes, and snippets.

@nikkaroraa
Last active July 10, 2017 20:02
Show Gist options
  • Save nikkaroraa/04b052ff75a47a0e76ff1920ef0de74d to your computer and use it in GitHub Desktop.
Save nikkaroraa/04b052ff75a47a0e76ff1920ef0de74d to your computer and use it in GitHub Desktop.
es6ClassesnThis

ES6 Classes

Refer:

What's the difference between

var A = function () {
    this.x = function () {
        //do something
    };
};

and

var A = function () { };
A.prototype.x = function () {
    //do something
};

Solution: The examples have very different outcomes.

Before looking at the differences, the following should be noted:

A constructor's prototype provides a way to share methods and values among instances via the instance's private [[Prototype]] property. A function's this is set by how the function is called or by the use of bind (not discussed here). Where a function is called on an object (e.g. myObj.method()) then this within the method references the object. Where this is not set by the call or by the use of bind, it defaults to the global object (window in a browser) or in strict mode, remains undefined. JavaScript is a object oriented language, i.e. everything is an Object, including functions.

So here are the snippets in question:

var A = function () {
    this.x = function () {
        //do something
    };
};

In this case, variable A is assigned a value that is a reference to a function. When that function is called using A(), the function's this isn't set by the call so it defaults to the global object and the expression this.x is effectively window.x. The result is that a reference to the function expression on the right hand side is assigned to window.x.

In the case of:

var A = function () { };
A.prototype.x = function () {
    //do something
};

something very different occurs. In the first line, variable A is assigned a reference to a function. In JavaScript, all functions objects have a prototype property by default so there is no separate code to create an A.prototype object.

In the second line, A.prototype.x is assigned a reference to a function. This will create an x property if it doesn't exist, or assign a new value if it does. So the difference with the first example is which object's x property is involved in the expression.

Another example is below. It's similar to the first one (and may be what you meant to ask about):

var A = new function () {
    this.x = function () {
        //do something
    };
};

In this example, the new operator has been added before the function expression so that the function is called as a constructor. When called with new, the function's this is set to reference a new Object whose private [[Prototype]] property is set to reference the constructor's public prototype. So in the assignment statement, the x property will be created on this new object. When called as a constructor, a function returns its this object by default, so there is no need for a separate return this; statement.

To check that A has an x property:

console.log(A.x) // function () {
                 //   //do something
                 // };

This is an uncommon use of new, since the only way to reference the constructor is via A.constructor. It would be much more common to do:

var A = function () {
    this.x = function () {
        //do something
    };
};
var a = new A();

Another way of achieving a similar result is to use an immediately invoked function expression:

var A = (function () {
    this.x = function () {
        //do something
    };
}());

In this case, A assigned the return value of calling the function on the right hand side. Here again, since this is not set in the call, it will reference the global object and this.x is effectively window.x. Since the function doesn't return anything, A will have a value of undefined.

These differences between the two approaches also manifest if you're serializing and de-serializing your Javascript objects to/from JSON. Methods defined on an object's prototype are not serialized when you serialize the object, which can be convenient when for example you want to serialize just the data portions of an object, but not it's methods:

var A = function () { 
    this.objectsOwnProperties = "are serialized";
};

A.prototype.prototypeProperties = "are NOT serialized";

var instance = new A();
console.log(instance.prototypeProperties); // "are NOT serialized"
console.log(JSON.stringify(instance)); 
// {"objectsOwnProperties":"are serialized"} 

Also see

Javascript Bind Function

Bind creates a new function that will have this set to the first parameter passed to bind().

Here's an example that shows how to use bind to pass a member method around that has the correct this:

var Button = function(content) { 
  this.content = content;
};
Button.prototype.click = function() {
  console.log(this.content + ' clicked');
}

var myButton = new Button('OK');
myButton.click();

var looseClick = myButton.click;
looseClick(); // not bound, 'this' is not myButton - it is the global object

var boundClick = myButton.click.bind(myButton); //bind is added to the function definition
boundClick(); // bound, 'this' is myButton

Which prints out:

OK clicked
undefined clicked
OK clicked

You can also add extra parameters after the 1st (this) parameter and bind will pass in those values to the original function. Any additional parameters you later pass to the bound function will be passed in after the bound parameters:

// Example showing binding some parameters
var sum = function(a, b) {
  return a + b;
};

var add5 = sum.bind(null, 5);
console.log(add5(10));

Which prints out:

15

Refer

Production and Development Server

#Watching changes in webpack config:

./node_modules/.bin/webpack --watch

watch:true in webpack.config.js

##render function is used for creating a virtual DOM

React likes to think of a webpage as composition of elements

React-Components React-Elements

Classes				Objects

###Props are values used for instantiating

###Events are responsible for the change of state

####render function of Render.Component can only return one root element

react elements are HTML elements or custom-tailored elements.

className

Functional and Class components [link] (http://javascriptplayground.com/blog/2017/03/functional-stateless-components-react/)

Functions that modify its input parameters are known as impure functions.

[Today's structure] (bit.ly/2svk8hc)

declarative: what imperative: how

React is a declarative library

this.setState and this.state

binding this in js

One way data flow in React Data only flows downwards From parent to child through props

props are immutable

https://stackoverflow.com/questions/32516204/uncaught-referenceerror-this-is-not-defined-in-class-constructor

setState and set

https://github.com/malikankit/city_react_app

https://stackoverflow.com/a/20279485/5733330

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment