2014-04-12 12 views
6

Zważywszy MDN's Object.create polyfill:Dlaczego polyfill MDN `Object.create` nie ustawił` prototype.constructor`?

if (typeof Object.create != 'function') { 
    (function() { 
    var F = function() {}; 
    Object.create = function (o) { 
     if (arguments.length > 1) { throw Error('Second argument not supported');} 
     if (o === null) { throw Error('Cannot set a null [[Prototype]]');} 
     if (typeof o != 'object') { throw TypeError('Argument must be an object');} 
     F.prototype = o; 
     return new F(); 
    }; 
    })(); 
} 

Skupiając się szczególnie na tych dwóch liniach:

F.prototype = o; 
return new F(); 

Zastanawiałem się, dlaczego nie jest to właściwe ustalenie F.prototype.constructor = F;?

F.prototype = o; 
F.prototype.constructor = F; // why not? 
return new F(); 
+1

Dlaczego chcesz ustawić 'constructor' na' F'? To tylko wewnętrzny pomocnik. Jaka byłaby korzyść? –

+5

Dodatkową rzeczą jest to, że polyfills powinny naśladować zachowanie tak blisko jak to możliwe i (bez możliwości testowania w tej chwili) dany polyfill powinien ocenić '({}). Constructor == Object.create ({}). Constructor' to "true", jak w natywnym 'Object.create' –

+0

Uważam, że druga uwaga t.niese (o dokładnej mimice, a nie idealnym zachowaniu) jest właściwą odpowiedzią. – Chris

Odpowiedz

3

Zastanawiałem się, dlaczego nie jest to właściwe ustalenie F.prototype.constructor = F ;?

F to tymczasowa funkcja i wydaje się celowe, że nie ma sposobu, aby odwoływać się do niej z zewnątrz Object.create.

Powiązane problemy