2013-03-30 2 views
0

Почему полезно иметь эти две функции, создавать и строитьЗачем нам нужны создать и построить функции

if (!Object.create) { 
    Object.create = function(base) { 
    function F() {}; 
    F.prototype = base; 
    return new F(); 
    } 
} 

if (!Object.construct) { 
    Object.construct = function(base) { 
    var instance = Object.create(base); 
    if (instance.initialize) 
     instance.initialize.apply(instance, [].slice.call(arguments, 1)); 
    return instance; 
    } 
} 
+0

Кто бы сказал, «нам нужны функции создания и построения», а кто «мы»? – DanMan

ответ

1

Object.create был введен в JavaScript только 1.8.5 и позволяет создать новый объект с определенный прототип и набор свойств. Причина, по которой вы, возможно, захотите, чтобы код, который вы опубликовали, состоял в том, чтобы полилизовать функцию в старых браузерах, которые не поддерживают Object.create. Однако будьте осторожны, поскольку реализация polyfill поддерживает только первый аргумент.

Вот как вы можете использовать его:

var parentObject = { name: 'test' }, 
    childObject = Object.create(parentObject); 

console.log(childObject.name); // -> test 

Что касается Object.construct, я не нашел какую-либо ссылки на эту функцию в спецификации, но от того, что я могу видеть, он делает то же самое, как Object.create, но дополнительно, он вызовет функцию initialize объекта base в контексте вновь созданного объекта и передаст ему дополнительные параметры, которые вы могли бы передать после параметра base.

Например:

var parentObject = { 
    initialize: function (name) { 
     this.name = name; 
    } 
}; 

var childObject = Object.construct(parentObject, 'test'); 

console.log(childObject.name); // -> test 
0

"мы" нет. Object.create - это способ создания объектов с очень низким уровнем доступа к объекту в современных браузерах (те, которые используют эту часть ES5 для спецификации).

var bob = Object.create(Person.prototype, { name : { 
               writeable : false, 
               configurable : false, 
               value : "Bob"   }}); 

bob наследует от Person.

bob.name сейчас равно «Боб».
bob.name не может быть переписан.
bob.name не может быть изменен на другой тип данных (number/boolean/NaN/null/etc).
bob.name не может быть удален, кроме, пожалуй, путем избавления от bob, полностью.

Это будет работать только в современных браузерах.

Полифония только имеет часть наследования, поскольку старые версии JavaScript не разрешали доступ к перечислимым объектам, независимо от того, являются ли они пригодными для записи или специфичны для конкретных типов и т. Д.
Таким образом, они не могут быть polyfilled в.

НИКТО потребностиObject.create. Никто, кто не выполняет системную архитектуру (будь то AJAX-библиотеки или новая банковская система на основе NodeJS или облачная ОС или что-то еще). Даже тогда это полезно только в том случае, если вы можете гарантировать, что браузер использует современную версию JS.

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