如何在JavaScript中调用类似方法的属性

时间:2016-05-18 23:31:24

标签: javascript knockout.js

我从Git下载了代码,这里是链接https://github.com/MikeWasson/LocalAccountsApp

在这个visual studio解决方案中,我们有一个名为app.js的JavaScript文件,其中包含以下代码。

function ViewModel() {
var self = this;
var tokenKey = 'accessToken';

self.result = ko.observable();
self.user = ko.observable();

self.registerEmail = ko.observable();
self.registerPassword = ko.observable();
self.registerPassword2 = ko.observable();

self.loginEmail = ko.observable();
self.loginPassword = ko.observable();

function showError(jqXHR) {
    self.result(jqXHR.status + ': ' + jqXHR.statusText);
    //self.loginPassword();
}

self.callApi = function () {
    self.result('');

    var token = sessionStorage.getItem(tokenKey);
    var headers = {};
    if (token) {
        headers.Authorization = 'Bearer ' + token;
    }

    $.ajax({
        type: 'GET',
        url: '/api/values',
        headers: headers
    }).done(function (data) {
        self.result(data);
    }).fail(showError);
}

self.register = function () {
    self.result('');

    var data = {
        Email: self.registerEmail(),
        Password: self.registerPassword(),
        ConfirmPassword: self.registerPassword2()
    };

    $.ajax({
        type: 'POST',
        url: '/api/Account/Register',
        contentType: 'application/json; charset=utf-8',
        data: JSON.stringify(data)
    }).done(function (data) {
        self.result("Done!");
    }).fail(showError);
}

self.login = function () {
    self.result('');

    var loginData = {
        grant_type: 'password',
        username: self.loginEmail(),
        password: self.loginPassword()
    };

    $.ajax({
        type: 'POST',
        url: '/Token',
        data: loginData
    }).done(function (data) {
        self.user(data.userName);
        // Cache the access token in session storage.
        sessionStorage.setItem(tokenKey, data.access_token);
    }).fail(showError);
}

self.logout = function () {
    self.user('');
    sessionStorage.removeItem(tokenKey)
   }
  }
     var app = new ViewModel();
     ko.applyBindings(app);

我无法理解属性如何

self.result, self.registerEmail, self.registerPassword/Password2, self.loginEmail, self.loginPassword 

成了方法。因为当我输入" self"然后是一个点,intellisense给出了上面提到的所有" self"属性作为方法。像

  self.result(), self.registerPassword()

显然" ko"来自Knockout.js库。

但是当我尝试在我的简单JavaScript代码中模仿它时。它失败了,我知道这样做是不对的

  var SomeObj = {
  ok : function()
   {
    var x = 10, y= 10, z;
    z = x+ y;
    return z;
   }
 }


  function ViewModel()
  {
     var self = this;
     self.result = SomeObj.ok();
     function xyz()
     {
        self.result();
         alert(5700);
     }
}

var v = new ViewModel();
alert(v.result());  

但是对象" self"宣布"结果"作为属性,稍后使用它就像app.js中的方法一样,当我尝试

     alert(v.result());
警告语句中的

它给了我一个例外,但如果我这样做

     alert(self.result()); 
在app.js中,它给了我回复" undefined"但为什么不是我的代码中的异常。

1 个答案:

答案 0 :(得分:2)

您在这里看到的问题是,通过使用括号,您将调用SomeObj.ok方法,而不是将其指定为函数。要将方法存储为函数指针,您应该执行以下操作:

self.result = SomeObj.ok;

在此之后,您将能够使用self.result()执行指定的方法,该方法将返回指定的SomeObj.ok方法的结果。

在此检查observable的定义: 它定义了一个函数,该函数返回一个函数,该函数还根据是否发送参数提供读写逻辑。如果您的ok函数返回了一个函数而不是结果,则可以使用与observable相同的方式访问它。

var SomeObj = {
  ok : function() {
    return function() {
      var x = 10, y= 10, z;
      z = x+ y;
      return z;
    }
  }
}

现在,赋值self.result = SomeObj.ok();将使用函数对self.result进行填充,因此调用self.result()将调用已分配的函数。