javascript

时间:2016-08-07 09:03:56

标签: javascript

var createworker = function() {

    var workcount;
    var input;
    (function() {
        workcount = 0;
        console.log("hello");
    }());
    var task1 = function() {
        workcount += 1;
        console.log("task1" + workcount);
    };
    var task2 = function(a) {
        workcount += 1;
        input = a;
        console.log("task2" + workcount + "variable" + a);
    };
    var task3 = function() {
        console.log(input);
    };

    return {
        job1: task1,
        job2: task2,
        job3: task3
    };
}

var worker = new createworker();
worker.job1();
worker.job2(2);
worker.job3();

var worker1 = createworker();
worker1.job1();
worker1.job2(2);
worker1.job3();

两者都一样。那为什么要使用new以及何时使用它?

1 个答案:

答案 0 :(得分:2)

  

两者都相同。

他们认为他们的工作方式相同,就是你要从createworker返回一个对象。这会覆盖new所做的工作。

new构造函数一起使用。它这样做:

  1. 创建一个由对象支持的新对象,构造函数的prototype属性指向
  2. 使用引用该新对象的this调用构造函数
  3. 在正常情况下,new functionname的结果是对new创建的对象的引用。 但是,如果构造函数返回非null对象引用,则new表达式的结果是该对象而不是。就是在你的createworker示例中发生的“但是”。
  4. 因此,createworker的版本不需要new,因为它的编写方式。

    这样做是绝对正确的;事实上,有些人总是这样做。如果您想将newcreateworker一起使用,那么这是一个设计用于这种方式的版本(重命名为CreateWorker,因为按照惯例,构造函数是大写的):

    var CreateWorker = function() {
    
        var workcount;
        var input;
        (function() {               // Side note: This function is pointless. Just move
            workcount = 0;          // <− this line
            console.log("hello");   // <− and this one
        }());                       // ...out into the body of `createworker`/`CreateWorker`
    
        // Note we assign to properties on `this`
        this.job1 = function() {
            workcount += 1;
            console.log("task1" + workcount);
        };
        this.job2 = function(a) {
            workcount += 1;
            input = a;
            console.log("task2" + workcount + "variable" + a);
        };
        this.job3 = function() {
            console.log(input);
        };
    
        // Note we aren't returning anything
    };