Given simple JS inheritance, what's the practical difference in the base function between these two examples? In other words, when should a person choose to define a function on "this" instead of on the prototype (or the other way around)?
For me the second example is easier to digest, but how much more is there to this?
function defined on this:
//base var _base = function () { this.baseFunction = function () { console.log("Hello from base function"); } }; //inherit from base function _ctor() { this.property1 = "my property value"; }; _ctor.prototype = new _base(); _ctor.prototype.constructor = _ctor; //get an instance var instance = new _ctor(); console.log(instance.baseFunction);
function defined on prototype:
//base var _base = function () {}; _base.prototype.baseFunction = function () { console.log("Hello from base function"); } //inherit from base function _ctor() { this.property1 = "my property value"; }; _ctor.prototype = new _base(); _ctor.prototype.constructor = _ctor; //get an instance var instance = new _ctor(); console.log(instance.baseFunction);
While a function definition specifies how the function does what it does (the "implementation"), a function prototype merely specifies its interface, i.e. what data types go in and come out of it.
The only difference between the function prototype and the function header is a semicolon (see diagram below). The function definition is placed AFTER the end of the int main(void) function. The function definition consists of the function header and its body.
A function prototype ensures that calls to a function are made with the correct number and types of arguments. A function prototype specifies the number of arguments. It states the data type of each of the passed arguments.
prototype is a property of a Function object. It is the prototype of objects constructed by that function. __proto__ is an internal property of an object, pointing to its prototype.
Functions on the prototype are only created once and shared between each instance. Functions created in the constructor are created as new objects for each new object created with the constructor.
As a general rule functions should be on the prototype since they will generally not be modified for different objects of the same type, and this has a slight memory/performance benefit. Other properties like objects and arrays should be defined in the constructor, unless you want to create a shared, static property, in which case you should use the prototype.
Its easier to see the distinctions with normal objects or arrays rather than functions
function Foo(){ this.bar = []; } var fooObj1 = new Foo(); var fooObj2 = new Foo(); fooObj1.bar.push("x"); alert(fooObj2.bar) //[]
as opposed to:
function Foo(){ } Foo.prototype.bar = [] var fooObj1 = new Foo(); var fooObj2 = new Foo(); fooObj1.bar.push("x"); alert(fooObj2.bar) //["x"]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With