473,395 Members | 1,680 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,395 software developers and data experts.

What's the difference between someFunc.blah = function(){} and someFunc.prototype.blah = function(){}?

Daz
Hi everyone.

My query is very straight forward (I think).

What's the difference between

someFunc.blah = function(){ ; }

and

someFunc.prototype.blah = function(){ ; }

? Does someFunc.blah call upon someFunc.prototype.blah? Is there any
difference?

Many thanks.

Daz.

Dec 21 '06 #1
5 2213

Daz wrote:
Hi everyone.

My query is very straight forward (I think).

What's the difference between

someFunc.blah = function(){ ; }

and

someFunc.prototype.blah = function(){ ; }

? Does someFunc.blah call upon someFunc.prototype.blah? Is there any
difference?

Many thanks.

Daz.
Take a look over this:
http://www.javascriptkit.com/javatutors/oopjs.shtml
On page 2 you will find the answer you are looking for.

Dec 21 '06 #2
Daz wrote:

[snip]
What's the difference between

someFunc.blah = function(){ ; }

and

someFunc.prototype.blah = function(){ ; }

? Does someFunc.blah call upon someFunc.prototype.blah?
No.
Is there any difference?
Yes, a very large one.

Properties of a prototype object are only significant when the function
- in this case, someFunc - is used as a constructor function. The
prototype object becomes part of the prototype chain, affecting what
values are obtained when reading a property of the new object.

When reading a property from an object, first the object itself is
checked to determine whether it has a property with that name. If so,
the value of that property is the result. If not, the first object in
the prototype chain is checked in the same way. This repeats until
either the property has been found, or the end of the chain has been
reached, in which case the result is the value, undefined.

This can be demonstrated quite simply.

var object;

function MyObject() {}
MyObject.myProperty = 'value';

object = new MyObject();

At this point, the function MyObject has a property named myProperty,
and an object has been created using that function. The aforementioned
property exists only on the function object -- the constructor function
-- and none of the objects created from it: the expression

typeof object.myProperty

will evaluate to 'undefined', not 'string'.

If, instead, the prototype object is modified:

var object;

function MyObject() {}
MyObject.prototype.myProperty = 'foo';

object = new MyObject();

different behaviour is seen. This time around, the constructor function
has no property named myProperty, but the object created using the
constructor does: the expressions

typeof object.myProperty

and

typeof MyObject.myProperty

will evaluate to 'string' and 'undefined', respectively. The value of
the former property is 'foo'.

Finally, it can be observed that adding a property directly to an object
obscures any value that might be obtained from the prototype chain.
Moreover, the prototype property remains unchanged:

var object, anotherObject;

function MyObject() {}
MyObject.prototype.myProperty = 'foo';

object = new MyObject();
anotherObject = new MyObject();

object.myProperty = 'bar';

Both objects have a property named myProperty, but the values differ:
the property of anotherObject obtains its value from the prototype
chain, whilst the property of object does not. The last assignment
statement creates a new property on the object, object, itself. In this
way, properties of a prototype object can be seen as default values for
object properties.
Keep in mind that the prototype chain is an internal property of
objects, and the chain itself cannot be changed once an object has been
created:

var object, anotherObject;

function MyObject() {}
MyObject.prototype.myProperty = 'foo';

object = new MyObject();

/* object.myProperty == 'foo' */

MyObject.prototype = {myProperty: 'bar'};

anotherObject = new MyObject();

/* object.myProperty == 'foo'
* anotherObject.myProperty == 'bar'
*/

If changing the value of the prototype property of MyObject had an
effect on existing objects, both objects would have observed a change in
value. As it happens, only new objects are affected.

However, if references to objects in the chain are retained,
modifications to them do have an effect:

var object;

function MyObject() {}
MyObject.prototype.myProperty = 'foo';

object = new MyObject();

/* object.myProperty == 'foo' */

MyObject.prototype.myProperty = 'bar';

/* object.myProperty == 'bar' */

Hope that helps,
Mike
Dec 29 '06 #3
Daz

Michael Winter wrote:
Daz wrote:

[snip]
What's the difference between

someFunc.blah = function(){ ; }

and

someFunc.prototype.blah = function(){ ; }

? Does someFunc.blah call upon someFunc.prototype.blah?

No.
Is there any difference?

Yes, a very large one.

Properties of a prototype object are only significant when the function
- in this case, someFunc - is used as a constructor function. The
prototype object becomes part of the prototype chain, affecting what
values are obtained when reading a property of the new object.

When reading a property from an object, first the object itself is
checked to determine whether it has a property with that name. If so,
the value of that property is the result. If not, the first object in
the prototype chain is checked in the same way. This repeats until
either the property has been found, or the end of the chain has been
reached, in which case the result is the value, undefined.

This can be demonstrated quite simply.

var object;

function MyObject() {}
MyObject.myProperty = 'value';

object = new MyObject();

At this point, the function MyObject has a property named myProperty,
and an object has been created using that function. The aforementioned
property exists only on the function object -- the constructor function
-- and none of the objects created from it: the expression

typeof object.myProperty

will evaluate to 'undefined', not 'string'.

If, instead, the prototype object is modified:

var object;

function MyObject() {}
MyObject.prototype.myProperty = 'foo';

object = new MyObject();

different behaviour is seen. This time around, the constructor function
has no property named myProperty, but the object created using the
constructor does: the expressions

typeof object.myProperty

and

typeof MyObject.myProperty

will evaluate to 'string' and 'undefined', respectively. The value of
the former property is 'foo'.

Finally, it can be observed that adding a property directly to an object
obscures any value that might be obtained from the prototype chain.
Moreover, the prototype property remains unchanged:

var object, anotherObject;

function MyObject() {}
MyObject.prototype.myProperty = 'foo';

object = new MyObject();
anotherObject = new MyObject();

object.myProperty = 'bar';

Both objects have a property named myProperty, but the values differ:
the property of anotherObject obtains its value from the prototype
chain, whilst the property of object does not. The last assignment
statement creates a new property on the object, object, itself. In this
way, properties of a prototype object can be seen as default values for
object properties.
Keep in mind that the prototype chain is an internal property of
objects, and the chain itself cannot be changed once an object has been
created:

var object, anotherObject;

function MyObject() {}
MyObject.prototype.myProperty = 'foo';

object = new MyObject();

/* object.myProperty == 'foo' */

MyObject.prototype = {myProperty: 'bar'};

anotherObject = new MyObject();

/* object.myProperty == 'foo'
* anotherObject.myProperty == 'bar'
*/

If changing the value of the prototype property of MyObject had an
effect on existing objects, both objects would have observed a change in
value. As it happens, only new objects are affected.

However, if references to objects in the chain are retained,
modifications to them do have an effect:

var object;

function MyObject() {}
MyObject.prototype.myProperty = 'foo';

object = new MyObject();

/* object.myProperty == 'foo' */

MyObject.prototype.myProperty = 'bar';

/* object.myProperty == 'bar' */

Hope that helps,
Mike
Thanks a lot for that Mike! It's really helped me out a lot. I also
heard that using prototype is more effective than declaring the
properties/methods inside of the function, as when prototype is used,
each new instance of the object is simply updated with a reference to
the new prototype, rather than having a fresh instance of each object,
inside of the newly created objects (if that makes sense).

Basically, using prototypes can save RAM usage, and hopefully speed the
objects up marginally.

Very useful stuff.

Thanks again. :)

Daz.

Dec 29 '06 #4
Daz wrote:

[snip]
Thanks a lot for that Mike! It's really helped me out a lot.
My apologies that I took so long to reply. It's been on my to-do list
for a while.
I also heard that using prototype is more effective than declaring the
properties/methods inside of the function, as when prototype is used,
each new instance of the object is simply updated with a reference to
the new prototype, rather than having a fresh instance of each object,
inside of the newly created objects (if that makes sense).
You're referring to

function MyObject() {
this.method = function () {
/* ... */
};
}

versus

function MyObject() {}
MyObject.prototype.method = function () {
/* ... */
};

right?

When a function expression is evaluated, a new function object is
created. In the first of the two snippets above, the function expression
inside the body of MyObject will be evaluated every time MyObject is
invoked -- every time a new object is created from MyObject. In the
second, the function expression is only evaluated once.
Basically, using prototypes can save RAM usage, and hopefully speed the
objects up marginally.
Memory, certainly; construction time, as well. Obtaining the value of
the property will take slightly longer though as it becomes necessary to
search the prototype chain rather than finding the property immediately
on the object itself. As trade-offs go, it's not a bad one.

There are, of course, circumstances where the first approach is best:
when a closure is needed for some reason. This is typically when using
"private" members.
Very useful stuff.

Thanks again. :)
You're welcome. :-)

Mike
Dec 29 '06 #5
Daz

Michael Winter wrote:
My apologies that I took so long to reply. It's been on my to-do list
for a while.
No problem. I am just greatful for your help.
I also heard that using prototype is more effective than declaring the
properties/methods inside of the function, as when prototype is used,
each new instance of the object is simply updated with a reference to
the new prototype, rather than having a fresh instance of each object,
inside of the newly created objects (if that makes sense).

You're referring to

function MyObject() {
this.method = function () {
/* ... */
};
}

versus

function MyObject() {}
MyObject.prototype.method = function () {
/* ... */
};

right?
Yes, indeed.
When a function expression is evaluated, a new function object is
created. In the first of the two snippets above, the function expression
inside the body of MyObject will be evaluated every time MyObject is
invoked -- every time a new object is created from MyObject. In the
second, the function expression is only evaluated once.
Basically, using prototypes can save RAM usage, and hopefully speed the
objects up marginally.

Memory, certainly; construction time, as well. Obtaining the value of
the property will take slightly longer though as it becomes necessary to
search the prototype chain rather than finding the property immediately
on the object itself. As trade-offs go, it's not a bad one.
Oh I see. So I guess it depends on the application of the code as to
which one would be best to use, as always.
There are, of course, circumstances where the first approach is best:
when a closure is needed for some reason. This is typically when using
"private" members.
Precisely. Thank you so much for your input again. If I can remember
even 50% of it, then I am off to a good start. Some day I will become a
JavaScript guru. I just hope that day comes before I die. Hehe.

I would like to wish you a happy new year, in advance.

Daz.

Dec 29 '06 #6

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

4
by: Nobody | last post by:
Lets say I have a class that is only available if a specific DLL (a.dll) is present. I can't link to that DLL through lib files or my app will fail on any machine that doesn't have a.dll. So I...
23
by: Ian Tuomi | last post by:
Hello, I was wondering, does it make any difference if you write void foo(int x) { /* insert code here */ } or foo(int x)
5
by: noblesantosh | last post by:
Hi all, What is the difference between following two function definations? <1> void func(void) { /* some code */ } <2> void func()
9
by: pamelafluente | last post by:
Hi, I was "studying" the famous (public code) BusyBox. I see the instruction: var busyBox = new BusyBox as in var busyBox = new BusyBox("BusyBox1", "busyBox", 4, "gears_ani_", ".gif",...
6
by: Charles Sullivan | last post by:
I define and initialize an array of structures like the following, (where the <verbiage within angle bracketsis just meant to be explanatory): int func1(<argument prototypes>); int...
15
by: robert maas, see http://tinyurl.com/uh3t | last post by:
Here's the source: #include <stdio.h> #include <errno.h> main () { char* str = "9999999999"; long long int llin; char* endptr; /* Set by strtoll */ int nch; errno = 0; llin = strtoll(str,...
92
by: Heinrich Pumpernickel | last post by:
what does this warning mean ? #include <stdio.h> int main() { long l = 100; printf("l is %li\n", l * 10L);
1
by: dennis.sprengers | last post by:
I've compared some open-source javascript editors, and found different techniques for constructing the code. Two examples: CodePress.run = function() { new CodePress(t); } CodePress =...
4
by: Gestorm | last post by:
Hi all, I found a macro "USE_VAR" in the code of bash-3.2 as follows: /*file: bash-3.2/shell.c*/ 344 USE_VAR(argc); 345 USE_VAR(argv); 346 USE_VAR(env); 347 USE_VAR(code); 348 ...
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
by: Hystou | last post by:
Overview: Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.