Javascript Prototypal экземпляр против псевдоклассической реализации

Я прочитал несколько других статей о прототипах против псевдоклассической инстанции и у меня все еще есть несколько вопросов. Я включил код ниже для иллюстрации.

Вопросы:

  1. Человек фактически такой же, как человек?
  2. Джон и Алиса по сути одинаковы?
  3. Какие побочные эффекты могут возникнуть в результате одного пути против другого?
  4. Существуют ли какие-либо существенные проблемы с производительностью, о которых мне следует знать?

    var Person = function() {
     hopes: function(){},
     dreams: function(){}
    };
    
    var John = Object.create(Person); // not supported in older browsers
    

    -

    var Human = function() {
    };
    
    Human.prototype.hopes = function(){}; // could add both hopes & dreams with an object
    Human.prototype.dreams = function(){};
    
    var Alice = new Human();
    

1 ответ

Решение

Ваш синтаксис немного отличается в первом примере, но да, это приведет к объектам, которые похожи. В первом примере это должно быть:

var Person = {
 hopes: function(){},
 dreams: function(){}
};

Хотя есть некоторые тонкие различия. С использованием new ключевое слово вызывает добавление объекта в цепочку прототипов, например Alice теперь будет использовать HumanПрототип цепи. Object.create устанавливает прототип объекта в параметр, например Person является Johnпрототип. Как правило, они будут похожи, за исключением случаев, когда вы делаете Object.create(null), в этом случае вы не получите базовый прототип объекта, как если бы вы сделали новый Object();

Вы можете запустить тесты производительности здесь http://jsperf.com/obj-create-vs-new/4

Другие вопросы по тегам