如何用返回块中写入的键值对调用函数?

时间:2016-10-14 04:47:45

标签: javascript function

受到角度服务方法声明的启发,我使用普通的javascript文件并以下面的方式编写函数(我不知道这种方法是什么)

test.js

gen_server

现在在HTML中,我想将其称为init

var MyService = function() {
        var base;

        var service = {
            init: function (formdata) {
                base.name = formdata.name;
                console.log('calling init');
            },
            other: function () {
               console.log('caling other');
            }
        }
        return service;
}

但会产生以下错误

未捕获ReferenceError:未定义MyService

我们不能用普通的javascript实现这种方式吗?

4 个答案:

答案 0 :(得分:4)

MyService是一个函数而不是具有属性的对象,您需要调用

MyService().init(formdata);

base也是未定义的,因此必须初始化为

var base = {};

完整示例

var MyService = function() {
        var base = {};
        var service = {
            init: function (formdata) {
                base.name = formdata.name;
                console.log('calling init');
            },
            other: function () {
               console.log('caling other');
            }
        }
        return service;
}


MyService().init({name:"2"}) ; //outputs 'calling init'

答案 1 :(得分:1)

试试这个

 function MyService() {
  this.base = "some thing";
  }

  MyService.prototype.init = function(formdata) {

   console.log('calling init =>'+this.base);
  }

 MyService.prototype.other = function(formdata) {

 console.log('caling other');
  }

var myser = new MyService();
myser.init(1);
 myser.other();

答案 2 :(得分:1)

正确的方法是使用原型。这用于创建SDK设计。如果您遇到任何JavaScript SDK,您将看到类似的模式。但这并不意味着你不能使用,我个人在我的所有项目中都使用它。

您应将MyService括在私有作用域中,以避免与其他名称空间冲突,并仅返回MyService

(function(){

    // move all variables to here
    var base;

    var _service = function(){
       // this is the constructor function, the initial functions can be run from here
    }


    _service.prototype = {

            init: function (formdata) {
                base.name = formdata.name;
                console.log('calling init');
            },
            other: function () {
               console.log('caling other');
            }
    }

    // invoke _service as myService in global scope
    window.MyService = new _service();

})();

现在您可以使用

访问MyService的所有功能
MyService.init({name:'James'}); // calling init
MyService.other(); // caling other

答案 3 :(得分:0)

试试这个。

function generateVPC() {
        var form = document.getElementById('Myform');
        formdata.name = 'Alpha';
        console.log(formdata);
        var myservice = new MyService();
        myservice.init(formdata);
      }

并且base也会给出错误,因此将base定义为

var base = {};