наиболее эффективный способ размещения объектов в JavaScript - PullRequest
0 голосов
/ 26 мая 2018

Это чисто вопрос производительности, и мне нет дела до удобства сопровождения или читабельности.

Этот вопрос о том, как наилучшим образом компоновать ООП в ключе c # / c ++ в javascript по отношению к виртуальным и не виртуальным методам.,Проблемы производительности в основном связаны с явной передачей объекта «this» и поиском метода в прототипе по сравнению с массивом.Четыре объекта, которые я имею в виду, предназначены для объекта:

 MyObjectvtable = [];
  function MyInnerObject() {}

  function MyObject() {
      this.mNum = 0;
      this.mObject = new MyInnerObject();
      this.mStr = "hello!";
      this.vtable = MyObjectvtable; 
  }

  function VirtualMethod() {
      var that = this;
      console.log(String(that.mNum) + that.mStr);
  };

  function NonVirtual(that) {
      console.log(String(that.mNum) + that.mStr);
  }

  MyObject.prototype.VirtualMethod = VirtualMethod;
  MyObjectvtable[0] = VirtualMethod;
  MyObjectvtable[1] = NonVirtual;

  pobj = new MyObject();

Четыре способа вызова метода здесь (VirtualMethod и NonVirtual) кратко используют вызов прототипа, явно передавая pobj в NonVirtual, ища VirtualMethodв таблице поиска и поиска метода в таблице поиска и явной передачи объекта this.

Метод 1 - Виртуальный прототип:

pobj.VirtualMethod();

Метод 2 - Не виртуальный

NonVirtual(pobj);

Метод 3 - vtable-this-bind

pobj.vtable[0].bind(pobj)();

Метод 4 - vtable -licit-bind

pobj.vtable[1](pobj);

Я добавил тестовые сценарии в JSPerf, но они кажутся неокончательными, поскольку Firefox предпочитает метод NonVirtual (может быть самым быстрым, но предполагает доступ к глобальной функции)).

Вот случай JSPerf: https://jsperf.com/virtual-vs-non-virtual-functions

...