Firestore обновления в реальном времени или Sockets.io для живого чата

Оператор new использует внутренний метод [[Construct]] , и он в основном делает следующее:

  • Инициализирует новый собственный объект
  • Устанавливает внутренний [[Prototype]] этого объекта, указывая на свойство Function prototype. Если свойство функции prototype не является объектом (примитивные значения, такие как Number, String, Boolean, Undefined или Null), вместо этого используется Object.prototype.
  • После создания объекта он вызывает функцию, предоставляя объект в качестве значения this.
  • Если возвращаемое значение вызываемой функции является примитивным, созданный объект внутренне возвращается.
  • В противном случае, если объект возвращается, объект, созданный внутри, теряется.

Эквивалентная реализация того, что делает оператор new, может (при условии, что доступен метод ECMAScript 5 Object.create):

function NEW(f) {
  var obj, ret, proto;

  // Check if `f.prototype` is an object, not a primitive
  proto = Object(f.prototype) === f.prototype ? f.prototype : Object.prototype;

  // Create an object that inherits from `proto`
  obj = Object.create(proto);

  // Apply the function setting `obj` as the `this` value
  ret = f.apply(obj, Array.prototype.slice.call(arguments, 1));

  if (Object(ret) === ret) { // the result is an object?
    return ret;
  }
  return obj;
}

// Example usage:
function Foo (arg) {
  this.prop = arg;
}
Foo.prototype.inherited = 'baz';

var obj = NEW(Foo, 'bar');
obj.prop;          // 'bar'
obj.inherited;     // 'baz'
obj instanceof Foo // true

0
задан Quentin C 28 March 2019 в 12:35
поделиться