creating objects from JS closure: should i use the “new” keyword?

前端 未结 2 983
别跟我提以往
别跟我提以往 2020-12-01 14:50

i answered one question about closures here in SO with this sample:

function Constructor() {
    var privateProperty = \'private\';
    var privateMethod = f         


        
相关标签:
2条回答
  • 2020-12-01 15:23

    Consider point 4 from this answer: What is the 'new' keyword in JavaScript?

    "It returns the newly created object, unless the constructor function returns a non-primitive value. In this case, that non-primitive value will be returned."

    So as function C1 from minitech's answer returns an empty object the variable c1 will be that returned object and not the one created by the 'new' statement. Therefore no instance of the constructor function.

    If I try to return a primitive value from the constructor function my webstorm tells me: "When called with new, this value will be lost and object will be returned instead."

    0 讨论(0)
  • 2020-12-01 15:27

    No, it's not the same thing. Consider when using instanceof:

    function C1() {
        return {};
    }
    
    function C2() {
    }
    
    var c1 = new C1();
    var c2 = new C2();
    alert(c1 instanceof C1); // false; wha...?
    alert(c2 instanceof C2); // true, as you'd expect.
    

    Here's a demo.

    So instead, create them by assigning to this, possibly with a safeguard to prevent forgotten news.

    function Constructor() {
        var privateProperty = 'private';
        var privateMethod = function() {
            alert('Called from private method');
        };
    
        this.publicProperty = "I'm public!";
        this.publicMethod = function() {
            alert('Called from public method');
        };
        this.getter = privateMethod;
    }
    

    Even better, use the prototype when possible:

    function Constructor() {
        var privateProperty = 'private';
        var privateMethod = function() {
            alert('Called from private method');
        };
    
        this.getter = privateMethod;
    }
    
    Constructor.prototype.publicProperty = "I'm public!";
    Constructor.prototype.publicMethod = function() {
        alert('Called from public method');
    };
    
    0 讨论(0)
提交回复
热议问题