10

Похож на, но отличается от this question. Код ниже от JavaScript: The Definitive Guide. Он в основном определяет метод наследования, который отклоняет Object.create, если он существует, в противном случае делает обычное старое наследование Javascript, используя конструкторы и обменивая прототипы.Преимущество использования Object.create

Мой вопрос в том, что Object.create не существует на много общих браузеров IE, в чем смысл даже его использовать? Это, безусловно, загромождает код, и один из комментаторов по предыдущему вопросу отметил, что Object.create isn't too fast.

В чем преимущество при попытке добавить дополнительный код, чтобы иногда использовать эту функцию ECMA 5, которая может быть или не быть медленнее, чем «старый» способ сделать это?

function inherit(p) { 
    if (Object.create) // If Object.create() is defined... 
     return Object.create(p); // then just use it. 

    function f() {}; // Define a dummy constructor function. 
    f.prototype = p; // Set its prototype property to p. 
    return new f(); // Use f() to create an "heir" of p. 
} 

ответ

9

Разница в скорости не очень заметно, так как по своей природе вы, вероятно, не будет создавать слишком много объектов (сотни, даже тысячи не то, что я называю много), а если вы и скорость критическая проблема, которую вы, вероятно, не будете кодировать в JS, и если оба из них не соответствуют действительности, то я уверен, что в нескольких версиях всех популярных JS-движений разница будет незначительной (это уже имеет место в некоторые).

В ответ на ваш вопрос, причины не скорость связанных, а потому, что шаблон проектирования из Object.create благоприятствуют к старому методу (по причинам, изложенным в том, что и другие ответы). Они позволяют правильно использовать атрибуты свойств ES5 (которые делают для более масштабируемых объектов и, следовательно, более масштабируемых приложений), и могут помочь с иерархиями наследования.

Это передовая техника. Если бы мы взяли линию «хорошо, она не реализована повсюду, поэтому давайте не будем мочить ноги», все будет двигаться очень медленно. Напротив, раннее и амбициозное принятие помогает отрасли продвигаться вперед, помогает лицам, принимающим решения, поддерживать новые технологии, помогает разработчикам совершенствовать и совершенствовать новые идеи и поддерживающие рамки. Я сторонник раннего (но предосторожного и все еще отсталого) принятия, потому что опыт показывает, что ожидание достаточного количества людей для поддержки технологии может оставить вас слишком долго. Май IE6 станет уроком для тех, кто думает иначе.

+0

Это действительно полезный ответ; Я вижу, почему создание было бы предпочтительнее, поскольку оно дает вам большой контроль над свойствами в созданном объекте. Я могу понять, почему вы хотите сказать «var bob = Object.create (userB, {« id »: {значение: 12, enumerable: false» и т. Д., Но этот код не будет сильно силен в IE9 и ниже «Не будет ли такое кодирование ограничено (замечательными) ситуациями, когда вы можете управлять браузером, который используют ваши пользователи? –

+0

Другими словами, в IE8 мне не только понадобится получить мой новый унаследованный метод, используя старый JS метод обхода прототипов вокруг, но мне также придется изменить объект, который передан, чтобы служить в качестве «дочернего» объекта, который наследуется от userB. Вместо '{« id »: {значение: 12, перечислимое: false 'мне не понадобится' {"id": 12, "name": "bob" и т. д. –

+0

@AdamRackis, это правда, код как есть не обратно совместим, но я уверен, что есть проекты, которые пытаются и упрощают эти вещи, а если нет, это хорошая идея. Автоматизировать эти изменения было бы нелегко. – davin

Смежные вопросы