Странное поведение при попытке сделать наследование прототипа - PullRequest
0 голосов
/ 09 сентября 2018

Я понимаю прототипическое наследование (то есть: если свойство не определено в текущем объекте, то цепь прототипа пересекается до тех пор, пока свойство или функция не будет найдена, а затем выполнится или будет возвращен ноль).

Проблема в том, что я получаю "undefined" для свойства, когда оно должно быть определено. Это свойство называется _context .

Ниже приведен вывод консоли инспектора Chrome. Это ясно показывает, что _context определено на прототипе YouAreConnected . (возле дна)

enter image description here

Однако мой тест Жасмин не проходит, потому что он говорит, что _context не определен в реализации.

enter image description here

Ниже приведена реализация.

define(['voice/states-new/State'],
function(State){

  var YouAreConnected = function YouAreConnected(context){

    Object.setPrototypeOf(this,new State());

    if(!context){
        throw Error('context must be set.');
    }
    else{
        this.__proto__._context = context;
    }

    /**
     * Initializes this state.
     *
     * pre:
     * - _context must be set with a socket connection
     *   which is 'connected'.
     *
     * post:
     * - Any initialization involving the server is
     *   executed.
     */
    this.init = function(){

      console.log(this);   // this produced the chrome console output.

      this._context.socket.emit('createRoom',_context.userId);
    }
  }

  return YouAreConnected;

});

Ниже приведен пример теста Жасмин.

  it('emits a "createRoom" event to the server upon creation', ()=>{
      var _context = TestHelper.mockContext;
      var state = new YouAreConnected(_context);
      spyOn(_context.socket,'emit');
      state.init();
      expect(_context.socket.emit).toHaveBeenCalled();
  })

ОБНОВЛЕНИЕ 1 Кажется, когда я передаю строку вместо объекта в конструктор YouAreConnected, _context больше не является неопределенным.

Это не удалось

it('emits a "createRoom" event to the server upon creation', ()=>{
      //var _context = TestHelper.mockContext;
      var state = new YouAreConnected({});  // object passed
      spyOn(_context.socket,'emit');
      state.init();
      expect(_context.socket.emit).toHaveBeenCalled();
  })

Это работает (_контекст больше не определен)

it('emits a "createRoom" event to the server upon creation', ()=>{
      //var _context = TestHelper.mockContext;
      var state = new YouAreConnected("mock");  // string passed
      spyOn(_context.socket,'emit');
      state.init();
      expect(_context.socket.emit).toHaveBeenCalled();
  })

ОБНОВЛЕНИЕ 2

Это работает (здесь не отображается _context undefined).

  it('emits a "createRoom" event to the server upon creation', ()=>{

      var _context = {

      }
      var state = new YouAreConnected(_context);
      state.init();
  })

Однако, когда я добавляю свойство «socket» к фиктивному объекту, он снова говорит, что _context не определен. Я не понимаю, почему.

  it('emits a "createRoom" event to the server upon creation', () => {
      var _context = {
        socket:{

        }
      }
      var state = new YouAreConnected(_context);
      state.init();
  })

1 Ответ

0 голосов
/ 09 сентября 2018

Вы звоните:

this._context.socket.emit('createRoom',_context.userId),

Но аргумент _context в emit не является локальной переменной, поэтому вам нужно использовать:

this._context.userId

за этот аргумент. то есть:

this._context.socket.emit('createRoom',this._context.userId),

Кроме того, вы никогда не устанавливаете userId для _context, но это другая проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...