Увеличивает ли использование ключевого слова this в конструкторе общее использование памяти? - PullRequest
2 голосов
/ 21 марта 2019

Например:

function Constructor() {
  this.peoperty = 1;
  this.myMethod1 = function() {
    //do something
  };
  this.myMethod2 = function() {
    let a = myMethod3();
  }
  
  /*no 'this' keyword for myFunction3,because 
    I am not going to call myFunction3 anywhere else,
    except inside this particular Constructor*/
  myMethod3 = function() {
    let b = 0;
    return b;
  };
}

var hello = new Constructor();

Я предполагаю, что ключевое слово this относится к экземпляру при создании переменной, использующей ключевое слово new.

Вопрос , если myMethod3 будет вызываться только внутри этого конструктора, могу ли я не использовать ключевое слово this для myMethod3, потому что я не собираюсь использовать hello.myMethod3 в любом месте моего кода. Сохраняет ли это некоторую память во время работы, так как я предполагаю, что только свойства / методы, которые связываются с ключевым словом this, будут занимать места в памяти для каждого экземпляра, созданного с ключевым словом new?

Ответы [ 2 ]

3 голосов
/ 21 марта 2019

Да, ваше предположение верно, если вы объявите метод в конструкторе, у каждого экземпляра будет свое определение:

function Cat() {
  this.meow = function() {
    console.log('meow');
  }
}

const cat1 = new Cat();
const cat2 = new Cat();

cat1.meow();
cat2.meow();

console.log(cat1.meow === cat2.meow);

Этого не произойдет, если вы используете ключевое слово prototype.В этом случае оба объекта будут иметь указатель на одно и то же определение:

    function Cat() {
    }
    
    Cat.prototype.meow = function() {
      console.log('meow');
    }

    const cat1 = new Cat();
    const cat2 = new Cat();
    
    cat1.meow();
    cat2.meow();

    console.log(cat1.__proto__.meow === cat2.__proto__.meow);
3 голосов
/ 21 марта 2019

В вашем текущем коде вы не объявляете myFunction3, поэтому функция будет находиться в глобальной области видимости, и каждый новый экземпляр Constructor будет отменять предыдущий myFunction3:

 const instance = new Constructor();
 myFunction3 = () => alert("whoops");
 instance.myFunction2(); // "whoops"

Поэтому существует только один myFunction3 за один раз, что экономит память, однако тогда нет смысла переопределять ее в конструкторе (никогда не имеет смысла не объявлять переменные).


Предполагается, что вы объявили это правильно с помощью:

 function myFunction3() {
   let b = 0;
   return b;
};

тогда вы вообще не будете сохранять память, поскольку ссылка на myFunction3 сохраняется при закрытии других функций, которые вы назначаете для this, поэтому myFunction3 будет оставаться в памяти столько, сколько любой экземпляр, на который ссылается this, делает. Если вы делаете

 this.myFunction3 = function() { /*...*/ };

он также будет оставаться в памяти до тех пор, пока существует this, поэтому они фактически равны с точки зрения памяти. Однако myFunction3 является несколько «приватным», поскольку к нему нельзя получить доступ через this.

...