Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript构造函数中访问私有成员_Javascript_Constructor - Fatal编程技术网

在JavaScript构造函数中访问私有成员

在JavaScript构造函数中访问私有成员,javascript,constructor,Javascript,Constructor,说我有这个 function FileHelper() { var _path = require("path"); } 我已经看到了两种实现构造函数方法的方法 function FileHelper() { var _path = require("path"); this.getFileName = function() { // can reference _path here } } 及 我倾向于将方法的实现“附加”到构造函数的原型,如果可能

说我有这个

function FileHelper() {
   var _path = require("path");
}
我已经看到了两种实现构造函数方法的方法

function FileHelper() {
   var _path = require("path");

   this.getFileName = function() {
        // can reference _path here
   }
}

我倾向于将方法的实现“附加”到构造函数的原型,如果可能的话,我希望将任何依赖项都包含在构造函数本身中,而不是在构造函数的文件中声明为全局

话虽如此,是否有办法实现以下目标

function FileHelper() {
   var _path = require("path");
}

FileHelper.prototype.getFileName = function (filePath) {
    // _path is successfully referenced without reference error
    return _path.basename(filePath);
}
话虽如此,是否有办法实现以下目标

function FileHelper() {
   var _path = require("path");
}

FileHelper.prototype.getFileName = function (filePath) {
    // _path is successfully referenced without reference error
    return _path.basename(filePath);
}
否。构造函数中声明的
\u路径
是一个局部变量。它对构造函数是完全私有的,并且在构造函数终止后会消失,因为构造函数不会创建任何会保留它的闭包

如果要继续使用,请执行以下任一操作:

  • 在构造函数中创建
    getFileName
    ,使其关闭,或
  • 将其另存为实例上的属性(
    this
    ),然后从该属性中使用它

  • 已经说过:在构造函数中通过
    require
    访问某些东西似乎有点反模式。因为它不会更改,所以只需在构造函数外部访问它,例如:

    var FileHelper = (function() {
        var _path = require("path");
    
        function FileHelper() {
        }
        FileHelper.prototype.getFileName = function() {
            // ...use _path here...
        };
    
        return FileHelper;
    })();
    

    (我将其保留在ES5级别的语法中,因为您的问题似乎在避免使用ES2015+)

    不,没有办法做到这一点。函数内声明的变量的作用域是该函数(以及函数内声明的任何函数)。当然,您可以将
    \u path
    附加到
    this
    以使其成为构造对象的属性,但它当时并不是真正的“私有”对象。我担心没有办法解决这个问题。为什么IIFE中有一个空的
    FileHelper
    函数声明?难道你不能在IIFE中引用
    FileHelper
    ,而不使用空函数声明吗?@jsdev17-你必须声明函数。另一个函数不是
    FileHelper
    ,它是一个立即执行(并且只执行一次)的IIFE,用于获取存储
    \u path
    的执行上下文。上面的结构(称为显示模块模式)为与
    FileHelper
    相关的任何内容提供了一个私有静态范围。