Setting javascript prototype function within object class declaration

前端 未结 5 639
既然无缘
既然无缘 2020-12-04 20:08

Normally, I\'ve seen prototype functions declared outside the class definition, like this:

function Container(param) {
    this.member = param;
}
Container.p         


        
5条回答
  •  暖寄归人
    2020-12-04 20:27

    When does it make sense to use prototype functions instead of closures?

    Well, it's the most lightweight way to go, let's say you have a method in the prototype of certain constructor, and you create 1000 object instances, all those objects will have your method in their prototype chain, and all of them will refer to only one function object.

    If you initialize that method inside the constructor, e.g. (this.method = function () {};), all of your 1000 object instances will have a function object as own property.

    If I need to use a prototype function for some reason, is it "OK" to define it INSIDE the class, like in my example, or should it be defined outside?

    Defining the members of a constructor's prototype inside itself, doesn't makes much sense, I'll explain you more about it and why your code doesn't works.

    I'd like to understand why the privateVar value of each instance is not accessible to the prototype function, only the first instance's value.

    Let's see your code:

    var Container = function(param) {
        this.member = param;
        var privateVar = param;
        if (!Container.prototype.stamp) {  // <-- executed on the first call only
            Container.prototype.stamp = function(string) {
                return privateVar + this.member + string;
            }
        }
    }
    

    The key point about your code behavior is that the Container.prototype.stamp function is created on the first method invocation.

    At the moment you create a function object, it stores the current enclosing scope in an internal property called [[Scope]].

    This scope is later augmented when you call the function, by the identifiers (variables) declared within it using var or a FunctionDeclaration.

    A list of [[Scope]] properties forms the scope chain, and when you access an identifier (like your privateVar variable), those objects are examined.

    And since your function was created on the first method invocation (new Container('A')), privateVar is bound to the Scope of this first function call, and it will remain bound to it no matter how do you call the method.

    Give a look to this answer, the first part is about the with statement, but in the second part I talk about how the scope chain works for functions.

提交回复
热议问题