Advertisement
vit134

Самодельный оператор new (Яндекс)

Nov 9th, 2018
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.     Самодельный оператор new
  3.     Что происходит внутри оператора  new ? Реализуйте функцию, аналогичную оператору (внутри функции нельзя использовать  new )
  4. */
  5.  
  6. function Person(name, age) {
  7.   this.name = name;
  8.   this.age = age;
  9. }
  10.  
  11. function myNew(fn) {
  12.     // 0. Оператор new работает с функциями
  13.   if (typeof fn !== 'function') throw myNew(Error, 'usage: myNew(function, ...arguments)');
  14.  
  15.   // 1. Принимает любое количество аргументов, которые передает в функцию-конструктор
  16.   var args = Array.prototype.slice.call(arguments, 1);
  17.  
  18.   // 2. Сначала создается новый объект, унаследованный от прототипа переданной функции.
  19.   var obj = Object.create(fn.prototype);
  20.   /**
  21.    * Альтернативный вариант, который тоже можно принять
  22.    * var obj = {};
  23.    * obj.__proto__ = fn.prototype;
  24.    **/
  25.  
  26.   // 3. Функция-конструктор вызывается в контексте этого нового объекта.
  27.   var res = fn.apply(obj, args);
  28.  
  29.   // 4. Правильная функция-конструктор не должна возвращать результата.
  30.   //   Если конструктор вернет что-то объекто-подобное, это станет результатом выполнения
  31.   //   оператора new. Если вернется примитив или null, то new вернет ранее созданный объект,
  32.   //   в контексте которого была вызвана функция-конструктор.
  33.   return (res instanceof Object) ? res : obj;
  34.   /**
  35.    * Проверка через typeof не работает в случае null: typeof null == 'object'.
  36.    * В примере — самая оптимальная и емкая проверка.
  37.    **/
  38. }
  39.  
  40. var person = myNew(Person, "Vasia", 34);
  41.  
  42. console.log(person.name, person instanceof Person);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement