| [ Web Proxy ] |
| Viewing: https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Object/setPrototypeOf | [Back] [Original] |
Get to know MDN better
Esta pgina ha sido traducida del ingls por la comunidad. Aprende ms y nete a la comunidad de MDN Web Docs.
This feature is well established and works across many devices and browser versions. Its been available across browsers since septiembre de 2015.
El mtodo Object.setPrototypeOf() establece el prototipo (p.e., la propiedad interna [[Prototype]]) de un objeto especificado a otro objeto o sino establece null.
Advertencia:
Cambiar la propiedad [[Prototype]] de un objeto es actualmente una operacin muy lenta en todos los navegadores y motores de JavaScript, debido a la forma en que los motores modernos de JavaScript optimizan el acceso a las propiedades. Adems, los efectos de alterar la herencia son sutiles y de amplio alcance, y no se limitan al tiempo empleado en la sentencia Object.setPrototypeOf(...), sino que pueden extenderse a cualquier cdigo que tenga acceso a un objeto cuyo [[Prototype]] haya sido modificado. Puedes leer ms sobre esto en Fundamentos de los motores de JavaScript: optimizacin de prototipos.
Dado que esta caracterstica forma parte del lenguaje, corresponde a los desarrolladores de motores implementarla de forma eficiente. Hasta que eso ocurra, si te preocupa el rendimiento, evita establecer el [[Prototype]] de un objeto. En su lugar, crea un nuevo objeto con el [[Prototype]] deseado usando Object.create().
Object.setPrototypeOf(obj, prototype);
objEl objeto al que se ha de establecer el prototipo.
prototypeEl nuevo prototipo del objeto, (un objeto o null).
Arroja una excepcin del tipo TypeError si el objeto cuyo [[Prototype]] se va a modificar no es extensible de acuerdo con Object.isExtensible(). No hace nada si el parametro prototype no es un objeto o null (p.e., nmero, cadena, booleano, o undefined). De cualquier otra forma, este mtodo cambia la propiedad [[Prototype]] del obj al valor nuevo.
Object.setPrototypeOf() est en el ltimo borrador del estandar ECMAScript6. Es considerado generalmente la manera adecuada de establecer el prototipo de un objeto, contra la propiedad ms controversial Object.prototype.__proto__.
var dict = Object.setPrototypeOf({}, null);
Utilizando la vieja propiedad Object.prototype.__proto__, podemos definir facilmente Object.setPrototypeOf si an no est disponible:
// Solo funciona en Chrome y FirefoxOnly works in Chrome y FireFox, no funciona en IE:
Object.setPrototypeOf =
Object.setPrototypeOf ||
function (obj, proto) {
obj.__proto__ = proto;
return obj;
};
Una combinacin de Object.getPrototypeOf() y Object.prototype.__proto__ permite agregar una nueva cadena de prototipos al nuevo prototipo del objeto.
/**
*** Object.appendChain(@object, @prototype)
*
* Agrega el primer prototipo no-nativo de una cadena a un nuevo prototipo.
* Retorna @object (si es Primitivo (Primitive value) ser transoformado a Objeto).
*
*** Object.appendChain(@object [, "@arg_name_1", "@arg_name_2", "@arg_name_3", "..."], "@function_body")
*** Object.appendChain(@object [, "@arg_name_1, @arg_name_2, @arg_name_3, ..."], "@function_body")
*
* Agrega el primer prototipo no-nativo de una cadena a la Function.prototype nativa del objeto, luego agrega una
* ueva Function(["@arg"(s)], "@function_body") a la cadena.
* Retorna la funcin.
*
**/
Object.appendChain = function (oChain, oProto) {
if (arguments.length < 2) {
throw new TypeError("Object.appendChain - Not enough arguments");
}
if (typeof oProto === "number" || typeof oProto === "boolean") {
throw new TypeError(
"second argument to Object.appendChain must be an object or a string",
);
}
var oNewProto = oProto,
oReturn =
(o2nd =
oLast =
oChain instanceof this ? oChain : new oChain.constructor(oChain));
for (
var o1st = this.getPrototypeOf(o2nd);
o1st !== Object.prototype && o1st !== Function.prototype;
o1st = this.getPrototypeOf(o2nd)
) {
o2nd = o1st;
}
if (oProto.constructor === String) {
oNewProto = Function.prototype;
oReturn = Function.apply(null, Array.prototype.slice.call(arguments, 1));
this.setPrototypeOf(oReturn, oLast);
}
this.setPrototypeOf(o2nd, oNewProto);
return oReturn;
};
function Mammal() {
this.isMammal = "yes";
}
function MammalSpecies(sMammalSpecies) {
this.species = sMammalSpecies;
}
MammalSpecies.prototype = new Mammal();
MammalSpecies.prototype.constructor = MammalSpecies;
var oCat = new MammalSpecies("Felis");
console.log(oCat.isMammal); // 'yes'
function Animal() {
this.breathing = "yes";
}
Object.appendChain(oCat, new Animal());
console.log(oCat.breathing); // 'yes'
function Symbol() {
this.isSymbol = "yes";
}
var nPrime = 17;
console.log(typeof nPrime); // 'number'
var oPrime = Object.appendChain(nPrime, new Symbol());
console.log(oPrime); // '17'
console.log(oPrime.isSymbol); // 'yes'
console.log(typeof oPrime); // 'object'
function Person(sName) {
this.identity = sName;
}
var george = Object.appendChain(
new Person("George"),
'console.log("Hello guys!!");',
);
console.log(george.identity); // 'George'
george(); // 'Hello guys!!'
| Specification |
|---|
| ECMAScript 2027 LanguageSpecification # sec-object.setprototypeof |
Reflect.setPrototypeOf()Object.prototype.isPrototypeOf()Object.getPrototypeOf()Object.prototype.__proto__This page was last modified on 24 jul 2026 by MDN contributors.
ObjectObject.assign()Object.create()Object.defineProperties()Object.defineProperty()Object.entries()Object.freeze()Object.fromEntries()Object.getOwnPropertyDescriptor()Object.getOwnPropertyDescriptors()Object.getOwnPropertyNames()Object.getOwnPropertySymbols()Object.getPrototypeOf()groupBy()Object.hasOwn()Object.is()Object.isExtensible()Object.isFrozen()Object.isSealed()Object.keys()Object.preventExtensions()Object.seal()Object.setPrototypeOf()Object.values()Object/FunctionYour blueprint for a better internet.
Portions of this content are 19982026 by individual mozilla.org contributors. Content available under a Creative Commons license.
| Web Proxy Viewer | New URL | Original Page |