This is a common misunderstanding. The two given examples are really doing entirely different things.
We can take a look at the differences, but let's make a few mental notes about javascript before diving into it:
For clarity, let's take a look at a third snippet. It's almost exactly like the first one (and may be what you meant to ask about):
By making yet another small change, we have a fourth interesting case for comparison:
Related questions:
If, on the other hand, you had two "A"-style objects, both with property x, each object's x would be made available to objects in an inheritance hierarchy via the prototype, regardless of whether they were explicitly assigned to a prototype object. The prototype always provides the access in the javascript system.
Javascript isn't a low-level language. It may not be very valuable to think of prototyping as a way to explicitly change the way memory is allocated.
We can take a look at the differences, but let's make a few mental notes about javascript before diving into it:
- The prototype of an object provides access to members of that object.
- The keyword this refers to the object context within which the function is executing.
- The language is functional, i.e. everything is an Object, including functions, and functions are values.
var A = function () {
this.x = function () {
//do something
};
};
In this case, variable A is assigned a function value. When that function is called, the runtime system will look for a variable "x"
in the current object context. Without any additional code in the
example, we could assume that this would be the global object. So to
sum up: in this first snippet, this refers to the object invoking A().var A = function () { };
A.prototype.x = function () {
//do something
};
Something very different is happening in the second snippet. In the first line, variable A is assigned a function value. In javascript, functions are objects, and all objects have a prototype member. So in the second line, the object A is assigned a property x via the prototype. As you can see, this is completely different from the effect in the prior snippet.For clarity, let's take a look at a third snippet. It's almost exactly like the first one (and may be what you meant to ask about):
var A = new function () {
this.x = function () {
//do something
};
};
In this third example, I've simply added the new keyword. This changes the meaning of the function, turning it into what is commonly called a constructor function. When called with new, the function is run in a blank object context. In other words, because of the new keyword, this will refer to a blank object which will be newly created and applied to the function invocation. Property x will be assigned to the blank object, and the function will return the new object with property x, assigning it to variable A.By making yet another small change, we have a fourth interesting case for comparison:
var A = function () {
this.x = function () {
//do something
};
}();
In this fourth case, variable A is created and assigned
the value of an executed inline function. The function is declared and
immediately executed, so whatever value it returns is assigned to A. Here again, this
will refer to the object context of the function call, and that object
would have a property x assigned to it. The inline function doesn't
explicitly return anything, so A will have a value of 'undefined'.Related questions:
- What does it mean that javascript is a prototypal language?
- What is the scope of a function in Javascript?
If, on the other hand, you had two "A"-style objects, both with property x, each object's x would be made available to objects in an inheritance hierarchy via the prototype, regardless of whether they were explicitly assigned to a prototype object. The prototype always provides the access in the javascript system.
Javascript isn't a low-level language. It may not be very valuable to think of prototyping as a way to explicitly change the way memory is allocated.
0 comments:
Post a Comment
Don't Forget to comment