无法理解JavaScript中的静态方法

时间:2015-04-08 13:09:02

标签: javascript closures

我正在阅读一本书“Pro JavaScript Technics”,其中有一部分解释了如何在JavaScript对象中实现静态变量,

按照这个解释我写了一个代码。

代码是应该有一个Employee类,我们应该能够创建员工对象。 Employee类应该使用静态方法作为setter和getter来设置员工工作的“Firm”的值。

如果静态公司名称更改为其他名称,则必须在所有Employee对象中看到该更改,

代码如下,

    var fn46 = function(){

    var Employee = (function(){

        var fn = function(employeeName){
            var name = undefined;

            this.setName = function(employeeName){
                name = employeeName;
            };

            this.getName = function(){
                return name;
            }

            this.setName(employeeName);
        };

        var FIRM = "";

        this.setFIRM = function(firmName){
            FIRM = firmName;
        };

        this.getFIRM = function(){
            return FIRM;
        };

        return fn;

    })();

    Employee.prototype.display = function(){
        return "Employee "+this.getName()+" works in "+Employee.getFIRM();      
    };

    var empArray = [    new Employee("Sudarshan Thakur"), 
                        new Employee("Pritesh Shah")
                    ];

    Employee.setFIRM("DropBox Inc.");

    for(var x=0; x < empArray.length; x++){
        print(empArray[x].display());
    }

    Employee.setFIRM("Yahoo Inc.");

    for(var x=0; x < empArray.length; x++){
        print(empArray[x].display());
    }   
};

fn46();

但是当我运行上面的代码时,我在输出中得到错误

js: uncaught JavaScript runtime exception: TypeError: Cannot find function setFIRM in object 

function(employeeName){...}。

现在,如果我将代码更改为

    var fn46 = function(){

    var Employee = (function(){

        var fn = function(employeeName){
            var name = undefined;

            this.setName = function(employeeName){
                name = employeeName;
            };

            this.getName = function(){
                return name;
            }

            this.setName(employeeName);
        };

        var FIRM = "";

        fn.setFIRM = function(firmName){
            FIRM = firmName;
        };

        fn.getFIRM = function(){
            return FIRM;
        };

        return fn;

    })();

    Employee.prototype.display = function(){
        return "Employee "+this.getName()+" works in "+Employee.getFIRM();      
    };

    var empArray = [    new Employee("Sudarshan Thakur"), 
                        new Employee("Pritesh Shah")
                    ];

    Employee.setFIRM("DropBox Inc.");

    for(var x=0; x < empArray.length; x++){
        print(empArray[x].display());
    }

    Employee.setFIRM("Yahoo Inc.");

    for(var x=0; x < empArray.length; x++){
        print(empArray[x].display());
    }   
};

fn46();

我得到了所需的输出

Employee Sudarshan Thakur works in DropBox Inc.
Employee Pritesh Shah works in DropBox Inc.
Employee Sudarshan Thakur works in Yahoo Inc.
Employee Pritesh Shah works in Yahoo Inc.

为什么我收到错误,

并且我想出的修正是正确的,e“fn.setFIRM”和“fn.getFIRM”用于制作静态方法,或者有一些不同的方法来实现这个

等待一些好的解释

1 个答案:

答案 0 :(得分:0)

如果您在第一次尝试时检查了全局对象(窗口),则会看到在那里定义了setFIRMgetFIRM方法。

为什么?

因为你定义了:

this.setFIRM = function...

this在全局上下文中使用时指向全局对象,而不是像您直观期望的那样指向Employee。 (除非您在use strictthis被评估为null/undefined

这就是您遇到错误的原因,以及更改为fn.setFIRM修复错误的原因。