【问题标题】:Javascript/Ecmascript get parent's this-variableJavascript/Ecmascript 获取父级的 this 变量
【发布时间】:2018-01-04 00:00:21
【问题描述】:

我有一个关于 javascript 变量继承的问题。

我正在尝试创建一个小型库,但无法将某些变量推送到子库中。

一开始我已经创建了根函数:

function myLibrary(param) {
  this.param = param
}

后来我想扩展它,但在模块中,所以我创建了第一个并想从 myLibrary 根目录中获取 param 但它不起作用:

myLibrary.prototype.myModule = {
  test: function() {
    console.log(this.param) // doesn't work - logs "unknown"
  }
}

有什么方法可以让它工作吗?就像我打电话的方式一样

myLibrary("foo").myModule.test();

foo 被记录了吗?

感谢您的帮助。

【问题讨论】:

  • 有什么问题对您有帮助吗?如果是 - 将相关的标记为答案。

标签: javascript inheritance parameters ecmascript-6


【解决方案1】:

在匿名函数中分配this 上的字段时,您将分配给窗口对象。要使用原型继承,请将您的函数用作带有 new 关键字的构造函数,或手动分配 __proto__ 字段。

此外,由于test 位于单独的对象上,您将无法识别正确的上下文。

所以,不要改变你的电话。我会改变你的库“构建自己”的方式并使用封装而不是类。

function myLibrary(param) {
  var mylib = {};
  
  mylib.myModule = {
    test: function(){
      console.log(param);
    }
  };
  
  return mylib;
}

myLibrary("foo").myModule.test(); // logs foo

这是一种非常常见的模式,并且经常使用。

但是,如果您打算使用继承,请在 JavaScript 中查找类。

【讨论】:

    【解决方案2】:

    您有 3 种方法: 1 - 在原型上创建方法:

    myLibrary.prototype.test = function() {
      console.log(this.param) 
    }
    
    new myLibrary("foo").test();
    

    2 - 从头开始​​创建原型:

    myLibrary.prototype = {
      test: function() {
        console.log(this.param) 
      }
    }
    
    new myLibrary("foo").test();
    

    3 - 或者按照本杰明在答案中写的方式 - 实现 module 模式。

    【讨论】:

      【解决方案3】:

      您可以进行如下更改

      myLibrary.prototype.myModule = (function(){
          var _private = this.param;
          return {
        test: function() {
          console.log(_private) // will work
        }};
      })();
      

      调用测试函数如下:

      new myLibrary("foo").myModule.test();
      

      【讨论】:

        【解决方案4】:

        我们可以创建一个闭包,参考这个:

            function MyLibrary(param) {// Please make sure that constructor 
                                         // name starts with capital.
              this.param = param;
            }
        
            MyLibrary.prototype.myModule = function(){
            var newParam = this.param; //free variable
              test = function() {  //closed function
                console.log(newParam) 
              }
              return test;
            }
            var myLibrary = new MyLibrary("foo"); //creating new library object
            var test = myLibrary.myModule();     //taking method returned by 
                                                //myModule
            test();//invoking it.
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-04
          • 1970-01-01
          • 2013-06-24
          • 1970-01-01
          • 2017-11-03
          • 2012-07-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多