Функция 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, его прототип установлен в переданный объект, а затем возвращается новый экземпляр.