#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. Спасибо за информацию, я знаю об объекте, но я хочу узнать о других альтернативах создания объекта.