Javascript / Ecmascript得到父这个变量

时间:2018-01-04 00:00:22

标签: javascript inheritance parameters ecmascript-6

我对javascript变量继承有疑问。

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

首先,我创建了根函数:

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

以后我想扩展它,但是在模块中,所以我创建了第一个,并希望从param根获得myLibrary,但它没有工作:

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

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

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

并且foo被记录了?

感谢您的帮助。

4 个答案:

答案 0 :(得分:2)

在匿名函数中为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中查找类。

答案 1 :(得分: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模式。

答案 2 :(得分:0)

您可以进行如下更改

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

调用测试功能如下:

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

答案 3 :(得分:0)

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

    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.