[removed] prototypes with callbacks and 'this'

后端 未结 3 1104
庸人自扰
庸人自扰 2020-12-31 10:47

I\'ve create a prototype based class Person that opens a WebSocket connection and defines callback functions as prototype methods.

Because inside the ca

3条回答
  •  佛祖请我去吃肉
    2020-12-31 11:22

    When declaring variables in Javascript, if you don't put a var in front, it'll be treated as a global variable, which causes some problem in your case.

    While the constructor is behaving as expected, you may want to do the following instead, so name is saved to the instance of Person you are creating:

    // Constructor
    function Person(name){
        // You don't need to reference "self" here. It's already implied.
        this.name = name;
    }
    

    In addition, in WebSocket.onopen, 'this' changes from the instance of a Person to the instance of a WebSocket. You'll need to preserve the 'Person' in order to reference it inside WebSocket.onopen.

    // Prototype
    Person.prototype = {
        getName : function(){
            // 'this' in this case refers to an instance of Person. 
            // So, when creating John, this.name will be John. 
            return this.name;
        },
    
        openConnection : function(host, port) {
            // Similar to getName(...), this refers to an instance of Person.
            // In your example, this.pointCount is NOT shared between John and Adam
            this.pointCount = 0;
            this.ws = new WebSocket("ws://" + host + (port ? ':' + port : ''));
    
            // In WebSocket.onopen below, you're working with a new scope, so you 
            // won't have access to 'this' as the Person anymore. You need to save 
            // 'this' somewhere, so you can reference it in the new scope.
            // *****
            var self = this;   
    
            this.ws.onopen = function() {
                // In this function, a new scope has been created. 'this' no 
                // longer refers to John/Adam (The instance of Person), but to 
                // WebSocket instead.
    
                console.log(this); // 'this' references the WebSocket instance
                console.log(self); // 'self' references the 'self' in the outer 
                                   // scope. See *****
    
                // Since this = WebSocket in this scope, all we need to do
                // is this.send(...). If you'd like to obtain the refer
                // to the instance of the Person you worked with, you can
                // use the 'self' variable
                this.send(self.name); 
            };
        }
    };
    

    Hope this helps! Here's a JSFiddle to go with it: http://jsfiddle.net/WFdbe/

提交回复
热议问题