1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
|
---
title: Object.prototype
slug: Web/JavaScript/Referencia/Objetos_globales/Object/prototype
tags:
- JavaScript
- Objeto
- Propiedad
translation_of: Web/JavaScript/Reference/Global_Objects/Object
translation_of_original: Web/JavaScript/Reference/Global_Objects/Object/prototype
---
<div>{{JSRef("Objetos_globales", "Object")}}</div>
<h2 id="Summary" name="Summary">Resumen</h2>
<p>La propiedad <code><strong>Object.prototype</strong></code> representa al objeto prototipo de {{jsxref("Object")}}.</p>
<p>{{js_property_attributes(0,0,0)}}</p>
<h2 id="Description" name="Description">Descripción</h2>
<p>Todos los objetos en JavaScript provienen de {{jsxref("Global_Objects/Object", "Object")}}; todos los objetos heredan métodos y propiedades de<code> Object.prototype</code>, aunque pueden ser sobrecargados. Sin embargo, un <code>Object</code> puede ser deliberadamente creado para que esto no sea cierto (por ejemplo usando {{jsxref("Object.create", "Object.create(null)")}}), o bien alterado para que no cumpla esta propiedad (por ejemplo usando {{jsxref("Object.setPrototypeOf")}}).</p>
<p>Cambios en el prototipo de {{jsxref("Object")}} son vistos por <strong>todos </strong>los objetos a traves de el encadenado de prototype, a no ser que las propiedades y los metodos sujetos a estos cambios sean sobreescritos en algun lugar de la cadena de prototype. Este poderoso y a la vez potencialmente peligroso mecanismo permite extender o sobreescribir el comportamiento de un objeto.</p>
<h2 id="Propiedades">Propiedades</h2>
<dl>
<dt>{{jsxref("Object.prototype.constructor")}}</dt>
<dd>Especifica la función que crea el prototipo de un objeto.</dd>
<dt>{{jsxref("Object.proto", "Object.prototype.__proto__")}} {{Non-standard_inline}}</dt>
<dd>Apunta al objeto que se usó como prototipo cuando fue instanciado.</dd>
<dt>{{jsxref("Object.noSuchMethod", "Object.prototype.__noSuchMethod__")}} {{Non-standard_inline}}</dt>
<dd>Permite a una función ser definida que sera ejecutada cuando un miembro del objeto es llamado como un metodo.</dd>
<dt><s class="obsoleteElement">{{jsxref("Object.count", "Object.prototype.__count__")}} {{obsolete_inline()}}</s></dt>
<dd>Se utiliza para devolver el número de propiedades enumerables directamente en un objeto definido por el usuario, pero que ha sido eliminado.</dd>
<dt><s class="obsoleteElement">{{jsxref("Object.parent", "Object.prototype.__parent__")}} {{obsolete_inline()}}</s></dt>
<dd><s class="obsoleteElement">Apunta al contexto de un objeto. Ha sido borrado.</s></dd>
</dl>
<h2 id="Métodos">Métodos</h2>
<dl>
<dt>{{jsxref("Object.defineGetter", "Object.prototype.__defineGetter__()")}} {{Non-standard_inline}} {{deprecated_inline()}}</dt>
<dd>Asocia una función con una propiedad que, cuando se accede a ella, ejecuta esa función y devuelve su valor de retorno.</dd>
<dt>{{jsxref("Object.defineSetter", "Object.prototype.__defineSetter__()")}} {{Non-standard_inline}} {{deprecated_inline()}}</dt>
<dd>Asocia una función con una propiedad que al establecerse ejecuta esa función que modifica la propiedad.</dd>
<dt>{{jsxref("Object.lookupGetter", "Object.prototype.__lookupGetter__()")}} {{Non-standard_inline}} {{deprecated_inline()}}</dt>
<dd>Devuelve la función asociada con la propiedad indicada por el método {{jsxref("Object.defineGetter", "__defineGetter__")}}.</dd>
<dt>{{jsxref("Object.lookupSetter", "Object.prototype.__lookupSetter__()")}} {{Non-standard_inline}} {{deprecated_inline()}}</dt>
<dd>Devuelve la función asociada con la propiedad indicada en el método {{jsxref("Object.defineSetter", "__defineSetter__")}}.</dd>
<dt>{{jsxref("Object.prototype.hasOwnProperty()")}}</dt>
<dd>Devuelve un valor lógico (boolean) que indica si el objeto contiene la propiedad indicada como una propiedad directa de ese objeto y no heredada por la cadena de prototipo.</dd>
<dt>{{jsxref("Object.prototype.isPrototypeOf()")}}</dt>
<dd>Devuelve una indicación <em>booleana</em> cuando el objeto especificado está en la cadena de prototipos del objeto sobre el cuál éste método es llamado.</dd>
<dt>{{jsxref("Object.prototype.propertyIsEnumerable()")}}</dt>
<dd>Devuelve un valor lógico (boolean) indicando si el attributo <a href="/es/docs/Web/JavaScript/Data_structures#Objetos">ECMAScript [[Enumerable]]</a> está definido.</dd>
<dt>{{jsxref("Object.prototype.toSource()")}} {{Non-standard_inline}}</dt>
<dd>Devuelve una cadena con el fuente de un literal de objeto que representa el objeto desde el que este método es llamado; se puede usar este valor para crear un nuevo objeto.</dd>
<dt>{{jsxref("Object.prototype.toLocaleString()")}}</dt>
<dd>Llama a {{jsxref("Object.toString", "toString()")}}.</dd>
<dt>{{jsxref("Object.prototype.toString()")}}</dt>
<dd>Devuelve la cadena de texto (string) que representa al objeto.</dd>
<dt>{{jsxref("Object.prototype.unwatch()")}} {{Non-standard_inline}}</dt>
<dd>Remueve un punto de mira de una propiedad del objeto.</dd>
<dt>{{jsxref("Object.prototype.valueOf()")}}</dt>
<dd>Devuelve el valor primitivo del objeto indicado.</dd>
<dt>{{jsxref("Object.prototype.watch()")}} {{Non-standard_inline}}</dt>
<dd>Agrega un punto de mira a una propiedad del objeto.</dd>
<dt><s class="obsoleteElement">{{jsxref("Object.prototype.eval()")}} {{ obsolete_inline()}}</s></dt>
<dd><s class="obsoleteElement">Se utiliza para evaluar una cadena de código JavaScript en el contexto del objeto especificado, pero que ha sido removido.</s></dd>
</dl>
<h2 id="Ejemplos">Ejemplos</h2>
<p>Al alterar el comportamiento de un método existente en Object.prototype, es oportuno considerar envolver el código de tu extensión antes o después de la existente lógica. Por ejemplo, este trozo de código (sin testear) ejecutara una determinada lógica antes de que la lógica existente o la de algún otro elemento sea ejecutada.</p>
<p>Cuando una función es llamada, los parámetros de la llamada son mantenidos en el argumento parecido a una array llamado "arguments". Por ejemplo, en la llamada "myFn(a, b, c)", los parámetros dentro del cuerpo de la función myFn estarán contenidos en una variable llamada "arguments". Si se desea llamar al siguiente método de la cadena de prototype, simplemente añade this y arguments a la funcion apply(). Este patrón puede ser usado en cualquier prototype, por ejemplo Node.prototype, Function.prototype, etc.</p>
<pre class="brush: js">var current = Object.prototype.valueOf;
// Como mi propiedad "-prop-value" es un atajo y no se encuentra siempre
// en la cadena de prototype, queremos modificar Object.prototype:
Object.prototype.valueOf = function() {
if (this.hasOwnProperty('-prop-value')) {
return this['-prop-value'];
} else {
// No parece que este objeto sea uno de los mios, por lo que recaeeremos
// en el comportamiento por defecto lo mejor que podamos.
// La llamada apply se comporta como el "super" en otros lenguages de programación.
// A pesar de que valueOf() no tiene parametros, alguna otra llamada podria tenerlos.
return current.apply(this, arguments);
}
}</pre>
<p>Como JavaScript no tiene objetos de tipo “subclase”, prototype es realmente útil para crear un objeto “base” donde ciertas funciones actúan como objetos. Por ejemplo:</p>
<pre class="brush: js">var Person = function(name) {
this.name = name;
this.canTalk = true;
};
Person.prototype.greet = function() {
if (this.canTalk) {
console.log('Hi, I am ' + this.name);
}
};
var Employee = function(name, title) {
Person.call(this, name);
this.title = title;
};
Employee.prototype = Object.create(Person.prototype);
Employee.prototype.constructor = Employee;
Employee.prototype.greet = function() {
if (this.canTalk) {
console.log('Hi, I am ' + this.name + ', the ' + this.title);
}
};
var Customer = function(name) {
Person.call(this, name);
};
Customer.prototype = Object.create(Person.prototype);
Customer.prototype.constructor = Customer;
var Mime = function(name) {
Person.call(this, name);
this.canTalk = false;
};
Mime.prototype = Object.create(Person.prototype);
Mime.prototype.constructor = Mime;
var bob = new Employee('Bob', 'Builder');
var joe = new Customer('Joe');
var rg = new Employee('Red Green', 'Handyman');
var mike = new Customer('Mike');
var mime = new Mime('Mime');
bob.greet();
// Hi, I am Bob, the Builder
joe.greet();
// Hi, I am Joe
rg.greet();
// Hi, I am Red Green, the Handyman
mike.greet();
// Hi, I am Mike
mime.greet();</pre>
<h2 id="Especificaciones">Especificaciones</h2>
<table class="standard-table">
<tbody>
<tr>
<th scope="col">Especificación</th>
<th scope="col">Estado</th>
<th scope="col">Observación</th>
</tr>
<tr>
<td>{{SpecName('ES1')}}</td>
<td>{{Spec2('ES1')}}</td>
<td>
<p>Definición inicial.Implementado en JavaScript 1.0.</p>
</td>
</tr>
<tr>
<td>{{SpecName('ES5.1', '#sec-15.2.3.1', 'Object.prototype')}}</td>
<td>{{Spec2('ES5.1')}}</td>
<td> </td>
</tr>
<tr>
<td>{{SpecName('ES6', '#sec-object.prototype', 'Object.prototype')}}</td>
<td>{{Spec2('ES6')}}</td>
<td>
<p> </p>
</td>
</tr>
<tr>
<td>{{SpecName('ESDraft', '#sec-object.prototype', 'Object.prototype')}}</td>
<td>{{Spec2('ESDraft')}}</td>
<td> </td>
</tr>
</tbody>
</table>
<h2 id="Compatibilidad_con_navegadores">Compatibilidad con navegadores</h2>
<p>{{Compat("javascript.builtins.Object.prototype")}}</p>
|