在嵌套对象中继承此作用域

Inheriting this scope in nested object

本文关键字:作用域 继承 嵌套 对象      更新时间:2024-02-01

我在JS中调用以下方法:

app.execute({
   first: function() {
      console.log('executed');
      oneMethod(); // function undefined
      app.oneMethod(); // works
      this.oneMethod(); // works when I exract app object into this variable
   },
   second: function() {
   }
});

应用程序对象如下所示:

var app = function() {
   var oneMethod = function() {
   };    
   var secondMethod = function() {
   };
   var execute = function(first, second) {
      var obj = new first();
   };
   this.oneMethod = oneMethod;
   this.secondMethod = secondMethod;
   this.execute = execute;
};

因此,第一个代码位于HTML中,第二个是外部库。我在execute()参数中使用了外部库的方法。我想这样做,这样我在全局命名空间中就不会有任何冲突——只有app变量,它的方法只能在它的参数对象中使用。

因此,当我用new关键字创建一个对象时,我希望在它的构造函数中有相同的名称空间,就像我在创建这个对象的地方所做的那样。

这可能吗?有更好的方法吗?

听起来你不希望app是一个构造函数,而是一个对象本身。您可以使用揭示模块模式(一个返回IIFE的对象)轻松地构建它:

var app = (function() {
    function oneMethod() {
        …
    }
    function secondMethod() {
        …
    }
    function execute(first, second) {
        var obj = new first();
    }
    return {
        oneMethod: oneMethod,
        secondMethod: secondMethod,
        execute: execute
    };
}());

我们创建了一个命名空间app,将方法绑定到命名空间,这样这些方法就不会泄漏到全局。即method未定义(要求#1),app.method()"有效"(要求#2)

app = {
  execute(First, Second) {},
  method(){}
};

我们在app.execute()中创建了一个First的实例,希望"在其构造函数中具有相同的命名空间",以便First构造函数中的this.method是相同的app.method(需求#3)。小提琴

app = {
  execute(First, Second) {
    var object = Object.create(app);
    First.call(object);
  },
  method() {}
};

如果存在app.method依赖的秘密变量

app = (function () {
  var secret = 'variable';
  return {
    execute(First, Second) { /*...*/ },
    method() { return secret }
  };
}());

请注意,我们使用了自ES2015以来引入的"对象初始值设定项上方法定义的较短语法"。(Thx,@Bergi)我们可以像一样将ES6解决方案转换为ES5

app = {
  execute: function (First, Second) {
    var object = Object.create(app);
    First.call(object);
  },
  method: function () {}
};