Есть ли что-то, что Object.create () может сделать, чего не может сделать функция фабрики? - PullRequest
0 голосов
/ 27 апреля 2018

Дуглас Крокфорд запрограммировал спецификацию Object.create () .

Однако я читал, что он больше не использует его.

... он также перестал использовать Object.create (хотя он был только добавлен для него на язык).

Дуглас Крокфорд рассказывает о новых хороших частях JavaScript в 2014 году

Если Крокфорд больше не использует Object.create (), нужно ли это? Есть ли что-то, что он предлагает, который не может быть каким-либо образом воспроизведен с помощью заводской функции?

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Тогда главное Object.create облегчает наследование прототипа. Шаблон как это:

function Animal(name) {
  this.name = name;
}

Animal.prototype = {
  sayName: function() {
    console.log(this.name);
  }
}

function Tiger(name) {
  Animal.call(this, name);
}

Tiger.prototype = Object.create(Animal.prototype, {
  scream: {
    value: function() {
      console.log('Roar!');
    }
  },
  constructor: {
    value: Tiger
  }
});

tiger = new Tiger('fido');

tiger.scream();
tiger.sayName();
console.log(Animal.prototype.isPrototypeOf(tiger.constructor.prototype));

не так просто скопировать. Существуют полифилы для Object.create, поэтому вы можете достичь того же самого без него, но, в конце концов, то, что он делает, довольно специфично, а в некоторых шаблонах может оказаться полезным.

Причина, по которой Дуглас Крокфорд не использует его, заключается в том, что он больше не использует наследование прототипов (по крайней мере, из этого видео). Таким образом, вы могли бы сделать что-то подобное вместо использования прототипа и Object.create:

function Animal(name) {
  var self = {};
  self.name = name;
  self.sayName = function() {
    console.log(self.name);
  }
  return self;
}

function Tiger(name) {
  var self = Animal(name);
  self.scream = function() {
    console.log('Roar!');
  }
  return self
}

tiger = Tiger('fido');

tiger.scream();
tiger.sayName();
console.log(Animal.prototype.isPrototypeOf(tiger.constructor.prototype));

и вы получите более или менее тот же результат, но это не совсем то же самое. Тигр на самом деле не наследует Animal в этом случае. Это другая модель. Вы можете решить использовать его, но это другой подход, а не тот, который заменяет шаблон Object.create.

Если ES6 используется все чаще и чаще, обычно заменяется Object.create, но не классами, а классами. Когда классы поддерживаются, вы можете сделать это:

class Animal {
  constructor(name) {
    this.name = name;
  }
  sayName() {
    console.log(this.name);
  }
}

class Tiger extends Animal {
  constructor(name) {
    super(name);
  }

  scream() {
    console.log('Roar!');
  }
}

tiger = new Tiger('fido');

tiger.scream();
tiger.sayName();
console.log(Animal.prototype.isPrototypeOf(tiger.constructor.prototype));

Что более или менее совпадает с первым шаблоном. Так что да, Object.create делает что-то конкретное, но все равно его заменяют классами.

0 голосов
/ 27 апреля 2018

Функциональность object.create сводится к:

Object.create = function(someObj){
    function noOP(){
    };
    noOP.prototype = someObj;
    return new noOP;
}

Цель состоит в том, чтобы создать объект, к которому вы можете добавлять вещи, не изменяя прототип вышестоящего. Это разработано как ярлык. Поэтому Object.create ничего не может сделать, чего не может сделать функция фабрики (или любая другая функция). Делайте все, что резонирует с вами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...