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();
Dlaczego chcesz ustawić 'constructor' na' F'? To tylko wewnętrzny pomocnik. Jaka byłaby korzyść? –
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' –
Uważam, że druga uwaga t.niese (o dokładnej mimice, a nie idealnym zachowaniu) jest właściwą odpowiedzią. – Chris