在嵌套对象中继承此范围

时间:2016-04-06 21:42:47

标签: javascript

我在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() {

   }
});

app对象如下所示:

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关键字创建对象时,我希望在其构造函数中具有相同的命名空间,就像我创建此对象时所做的那样。

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

我们在First中创建app.execute()的实例,希望“在其构造函数中具有相同的命名空间”,以使this.method构造函数中的First相同app.method 1}}(要求#3)。 fiddle

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以来引入的“a shorter syntax for method definitions on object initializer”。 (Thx,@ Bergi) 我们可以将ES6解决方案转换为ES5,就像那样

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