Использование «.call» для создания нового объекта JavaScript вместо «new» - PullRequest
2 голосов
/ 15 марта 2019

Я пробовал приведенные ниже команды на консоли Chrome. Я могу создать объект с помощью нового (строка 2 ниже), но с помощью вызова не работает. Кто-нибудь может объяснить, в чем может быть причина?

function ObjConstructor(){ this.sample = 1};

let withNew = new ObjConstructor();

let usingCall = ObjConstructor.call({});

usingCall
undefined  //output that came on console, this is not a command

withNew
ObjConstructor {sample: 1} //output that came on console

Ответы [ 3 ]

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

Результат call - это то, что возвращает функция. Ваш ObjConstructor не ничего не возвращает , поэтому в результате его вызова undefined.

Напротив, когда вы используете new, новый объект создается и передается функции, и если функция не возвращает объект, отличный от null, объект, созданный для new, является результатом new выражение.

Вот почему версия new работает, а call - нет.

Также обратите внимание, что call вообще не создает объект. В вашем ObjConstructor.call({}) объект создает {}, а не call. Он не будет иметь ObjConstructor.prototype в качестве прототипа. ({} является инициализатором необработанного объекта, поэтому объект будет иметь Object.prototype в качестве прототипа.)

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

new делает несколько вещей, включая:

  • Создание объекта
  • Установка значения this для этого объекта
  • Заставляет функцию возвращать этот объект по умолчанию

Ваш код:

  • Создает объект вручную с помощью {}
  • Устанавливает значение this для этого объекта с помощью call()

... но не делает последнее. В функции нет оператора return, поэтому она возвращает undefined.

0 голосов
/ 15 марта 2019

попробуйте это.Или посмотрите на это -> https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects

var MyType = function(_param1,_param2){
this.param1 = _param1;
this.param2 = _param2;

this.ShowParam = function(){
  alert(this.param1+" - "+this.param2);
  }
}

var test = new MyType("PARAM TEST 1","PARAM TEST 2");

alert(test.param1+" - "+test.param2);


var test2 = new MyType("PARAM TEST 1.2","PARAM TEST 2.2");

alert(test2.param1+" - "+test2.param2);

test.ShowParam();
test2.ShowParam();

 
...