无法理解JavaScript中的静态方法

Not able to understand static methods in JavaScript

本文关键字:静态方法 JavaScript      更新时间:2023-09-26

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

根据这个解释,我写了一个代码。

代码是应该有一个Employee类,我们应该能够从中创建Employee对象。Employee类应该有静态方法作为setter和getter,用于设置员工工作的"公司"的值。

如果静态公司名称更改为其他名称,则必须在所有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 

函数(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.

所以我为什么会出错,

我发现的修复方法是正确的,即"fn.setFIRM"answers"fn.getFIRM"使其成为静态方法,或者有一些不同的方法来实现这个

正在等待一些好的解释

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

为什么

因为你定义了:

this.setFIRM = function...

当在全局上下文中使用时,this指向全局对象,而不是像你直观地期望的那样指向Employee。(除非你在use strict中,在这种情况下,this被求值为null/undefined

这就是您出现错误的原因,也是更改为fn.setFIRM修复错误的原因。