为什么不能访问不同模型中的变量?

时间:2017-01-13 21:18:14

标签: javascript

我在下面提供了以下代码:

var BaseViewModel = function(options) {

  var template = null;

  var initialise = function(options) {
    if (options) {
      if (options.template) {
        template = options.template;
      }
    }
  };

  var getTemplateId = function() {
    return template.Id;
  };

  return {
    initialise: initialise,
    template: template,
    getTemplateId: getTemplateId
  };

}


var MainViewModel = function () {

  this.prototype = new BaseViewModel();

  var base = this.prototype;

  var initialise = function() {
    base.initialise({ 
      template: {
        Id: 1,
        Name: '',
      }
    })

    console.log(base.template); // Q. Why is this null here?
    console.log(base.getTemplateId()); // This however will return a value!

  };

  return {
    initialise: initialise,
  };

}


var mainViewModel = new MainViewModel();
mainViewModel.initialise();

Link to JS Bin

initialise()方法会调用MainViewModel方法,initialise()会在BaseViewModel()上使用模板变量调用base.template。我的问题是为什么在MainViewModel初始化之后我无法在{{1}}的给定点访问{{1}}?

谢谢

2 个答案:

答案 0 :(得分:1)

你设置

var google = require('googleapis');
var key = require('./Sig-Updater.json');
var gmail = google.gmail('v1');

var jwtClient = new google.auth.JWT(
  key.client_email,
  null,
  key.private_key,
  ['https://www.googleapis.com/auth/gmail.settings.basic', 'https://www.googleapis.com/auth/gmail.settings.sharing', 'https://www.googleapis.com/auth/gmail.modify', 'https://mail.google.com', 'https://www.googleapis.com/auth/gmail.compose',
'https://www.googleapis.com/auth/gmail.readonly' ],
  'some_email@somewhere.com'
);

jwtClient.authorize(function (err, tokens) {
  if (err) {
    console.log('Auth failed because: ' + err);
    return;
  }
  console.log(tokens)

  gmail.users.settings.sendAs.update({
    userId: 'me',
    auth: jwtClient,
    sendAsEmail: 'some_email@somewhere.com',
    signature: '<div dir="ltr">Hello there</div>'
  }, function (err, resp) {
    if(err){
      console.log(err);
    } else {
      console.log(resp);
    }
  });
});

并返回

var template = null;

在更新return { init: init, template: template, getTemplateId: getTemplateId }; 之后,它不会影响构造对象的属性值,因为template是一个基元,因此通过值传递,它不是通过引用传递的。

为了使其按照您希望的方式工作,您需要直接更新对象属性,例如:

template

答案 1 :(得分:0)

基本上,当您使用Feature: Background with condition Background: Given all background steps are done Scenario: run without background # steps of the scenario you don't need background @need_background Scenario: run with background # steps of the scenario you need background 时,您可以创建本地或私有变量。使用var时,您可以创建公共或特权变量(取决于它的编写方式)。这是一个更详细的例子,显示了不同之处。

http://phrogz.net/js/classes/OOPinJS.html