Функция Beget в JavaScript: Хорошие детали
Я читаю JavaScript: хорошие детали. В книге определена функция beget. Его цель - создать и вернуть новый объект, который использует другой объект в качестве своего прототипа. Почему функция beget создает экземпляр новой функции вместо объекта?
if( typeof Object.beget !== 'function' ){
Object.beget = function(o){
var F =new Function(){}; // this line, why it cannot be var F = new Object();
F.prototype = o;
return new F();
}
}
Ответы
Ответ 1
Это имеет все, что связано с ключевым словом new
. В JavaScript new
работает только с функциями (которые являются особым типом объекта).
-
Если вы используете new
только для любой функции, вы получите объект назад.
alert(typeof console.log); // function
var dumb = new console.log(); // dumb is an object
-
Тип возвращаемого объекта зависит от объекта прототипа функции.
alert(typeof console.log.prototype); // object, any new objects created by the new keyword will be of this type.
alert(typeof Function.prototype); // function, new objects are functions.
alert(typeof new Function()); // function, see?
alert(typeof (function(){})); // function, using literal syntax, equivalent
-
Возможно, вы заметили, что Function
сам является функцией. Фактически, все встроенные конструкторы являются функциями (Function, Object, Number, Array и т.д.). Капитализация - это просто соглашение о том, как вы используете функцию.
Итак, чтобы вернуться к вашему вопросу, автор использует пустой объект Function просто потому, что его можно использовать в качестве конструктора. Объекты не могут.
Затем он изменяет прототип конструктора, чтобы он возвращал объекты этого типа.
Object.beget = function(o) {
var F = new Function(); // now F can be used as a constructor.
F.prototype = o; // All new objects F creates will be based on o.
return new F();
};
Ответ 2
Чтобы добавить к предыдущим ответам и избежать некоторой путаницы, эта функция beget()
была заменена на create()
с помощью errata, поэтому разные книги, похоже, имеют другую версию кода. Книга, опубликованная в Safari Books Online, напечатана следующим образом:
if (typeof Object.create !== 'function') {
Object.create = function (o) {
var F = function () {};
F.prototype = o;
return new F();
};
}
Обратите внимание, что это больше не поощряет использование ключевого слова new
в строке 3.
Ответ 3
По-моему, поскольку MDN сказал
Новый оператор создает экземпляр пользовательского типа объекта или одного из встроенных типов объектов, который имеет конструкторную функцию.
Синтаксис
новый конструктор [([arguments])]
Параметры
Конструктор
Функция, задающая тип экземпляра объекта.
аргументы
Список значений, с которыми будет вызываться конструктор.
Итак, wo нужно использовать функцию для создания нового экземпляра.
Например:
var list = new Array();
typeof Array;//"function"
Этот массив не является объектом, а функцией-конструктором.
Ответ 4
С одной стороны, вы не можете использовать() для общего объекта или ни для чего другого, что не является функцией. Вы получите сообщение об ошибке типа TypeError: F не является функцией.
Ответ 5
// create a temporary function
var F =new Function(){};
// set the prototype of the function to be o
F.prototype = o;
// create a new object from the function
return new F();
Потому что работает new
. new создает новый объект и помещает F.prototype
в цепочку прототипов.
new F() === Object.create(F.prototype)
Ответ 6
Мои книги
if (typeof Object.beget !== 'function') {
Object.beget = function (o) {
var F = function () {};
F.prototype = o;
return new F();
};
}
Ответ 7
ваш ответ только в книге. Метод beget создал новый объект и этот объект используется в качестве своего прототипа.
Ниже строка используется для проверки того, используется ли метод beget или нет!
if( typeof Object.beget !== 'function' )
А потом..
Определен конструктор F, его прототип установлен в переданный объект, а затем возвращается новый экземпляр.