Использование «.call» для создания нового объекта JavaScript вместо «new»

#javascript #prototype

#javascript #прототип

Вопрос:

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

 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
  

Комментарии:

1. Отличные входные данные Квентин, Т.Дж.Си, «.call» работает плавно, когда мы используем его с «this» при настройке наследования, потому что это Object и к нему добавляются новые свойства, и возвращать что-либо не нужно 😉

Ответ №1:

new выполняет несколько действий, в том числе:

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

Ваш код:

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

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

Ответ №2:

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

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

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

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

Ответ №3:

попробуйте это. Или посмотрите на это -> 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();

   

Комментарии:

1. Спасибо за информацию, я знаю об объекте, но я хочу узнать о других альтернативах создания объекта.