2015-12-16 6 views
1

Полипол javascript Object.create(), по некоторым кодам, в которых я полностью смущен. Ссылка на код: polyfill of Object create.polyfill of javascript Объект create с простой формой

if (typeof Object.create != 'function') { 
 
    // Production steps of ECMA-262, Edition 5, 15.2.3.5 
 
    // Reference: http://es5.github.io/#x15.2.3.5 
 
    Object.create = (function() { 
 
     // To save on memory, use a shared constructor 
 
     function Temp() {} 
 

 
     // make a safe reference to Object.prototype.hasOwnProperty 
 
     var hasOwn = Object.prototype.hasOwnProperty; 
 

 
     return function(O) { 
 
      // 1. If Type(O) is not Object or Null throw a TypeError exception. 
 
      if (typeof O != 'object') { 
 
       throw TypeError('Object prototype may only be an Object or null'); 
 
      } 
 

 
      // 2. Let obj be the result of creating a new object as if by the 
 
      // expression new Object() where Object is the standard built-in 
 
      // constructor with that name 
 
      // 3. Set the [[Prototype]] internal property of obj to O. 
 
      Temp.prototype = O; 
 
      var obj = new Temp(); 
 
      Temp.prototype = null; // Let's not keep a stray reference to O... 
 

 
      // 4. If the argument Properties is present and not undefined, add 
 
      // own properties to obj as if by calling the standard built-in 
 
      // function Object.defineProperties with arguments obj and 
 
      // Properties. 
 
      if (arguments.length > 1) { 
 
       // Object.defineProperties does ToObject on its first argument. 
 
       var Properties = Object(arguments[1]); 
 
       for (var prop in Properties) { 
 
        if (hasOwn.call(Properties, prop)) { 
 
         obj[prop] = Properties[prop]; 
 
        } 
 
       } 
 
      } 
 

 
      // 5. Return obj 
 
      return obj; 
 
     }; 
 
    })(); 
 
}

  1. Почему это усложняет логику с помощью IIFE (Сразу Вызывается функция Express) и возврата функции и закрытия.
  2. Вместо этого могу ли я использовать простую логику и код ниже? Есть ли в нем неправильный или неприемлемый контент? Существует не IIFE и функция возврата.

if (typeof Object.createOwn != "function") { 
 
    Object.createOwn = function(O) { 
 
     // 1. if Type(O) is not Object or Null throw a TypeError exception. 
 
     if (typeof(O) != "object") { 
 
      throw TypeError("Object prototype may only be an Object or null"); 
 
     } 
 

 
     // 2. Let obj be the result of creating a new object as if by the 
 
     // expression new Object() where Object is the standard built-in 
 
     // constructor with that name 
 
     // 3. Set the [[Prototype]] internal property of obj to O. 
 
     var obj; 
 
     var Temp = function() {}; 
 
     Temp.prototype = O; 
 
     obj = new Temp(); 
 

 
     // 4. If the argument Properties is present and not undefined, add 
 
     // own properties to obj as if by calling the standard built-in 
 
     // function Object.defineProperties with arguments obj and Properties 
 
     if (arguments.length > 1) { 
 
      var Properties = Object(arguments[1]); 
 
      for (var prop in Properties) { 
 
       if (Properties.hasOwnProperty(prop)) { 
 
        obj[prop] = Properties[prop]; 
 
       } 
 
      } 
 
     } 
 
     return obj; 
 
    } 
 
} 
 

 
var foo = { 
 
    one: 1, 
 
    two: 2 
 
}; 
 

 
var bar = Object.createOwn(foo, 3);

ответ

1

Они оба будут работать, но оригинал использует IIFE по нескольким причинам. Два из них упоминается в комментариях

// To save on memory, use a shared constructor 

Это не так с вашей версией, где var Temp = function() {}; обернут в функцию и новый экземпляр создается каждый раз, когда вы его используете.

// make a safe reference to Object.prototype.hasOwnProperty 

Поскольку Object.prototype.hasOwnProperty потенциально может быть отменено, когда пришло время, чтобы использовать его, polyfill делает, что он имеет собственную безопасную ссылку на него на каждом Object.create.

Тогда это также распространенная причина, по которой многие используют IIFE, чтобы не загрязнять глобальное пространство имен.

Это в основном гарантии и не требуются в этом случае. Но я не вижу причин их устранять.