无法理解 JavaScript 中的静态方法

Not able to understand static methods in JavaScript

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

根据该解释,我编写了一段代码。

代码是应该有一个 Employee class 我们应该能够从中创建员工对象。 员工 class 应该有静态方法 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 

函数(员工姓名){...}。

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

    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.

那么为什么我收到错误,

我想出的解决方法是正确的,即 "fn.setFIRM" 和 "fn.getFIRM" 使它成为静态方法,或者有一些不同的方法来实现这个

等待一些好的解释

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

为什么?

因为你定义了:

this.setFIRM = function...

this 在全局上下文中使用时指向全局对象,而不是您直觉上期望的 Employee 。 (除非你在 use strict 中,在这种情况下 this 被评估为 null/undefined

这就是您出现错误的原因,这就是为什么更改为 fn.setFIRM 可以修复它。