Please note, this is a STATIC archive of website developer.mozilla.org from 03 Nov 2016, cach3.com does not collect or store any user information, there is no "phishing" involved.

Revision 1057940 of new operator

  • Revision slug: Web/JavaScript/Reference/Operators/new
  • Revision title: new operator
  • Revision id: 1057940
  • Created:
  • Creator: mishelashala
  • Is current revision? No
  • Comment

Revision Content

{{jsSidebar("Operators")}}

El  operador new crea una instancia de un objeto definido por el usuario o uno de los tipos de objetos incorporados que tienen una función de construcción.

Sintaxis

new constructor[([argumentos])]

Parametros

constructor
Una función que especifica el tipo de la instancia del objeto.
argumentos
Una lista de valores que serán llamados con el constructor.

Descripción

Crear un objeto definido por el usuario requiere dos pasos:

  1. Definir el tipo de objeto escribiendo una función.
  2. Crear una instancia del objeto con new.

Definir un tipo de objeto, crear una función para el tipo de objeto que especifique su nombre y sus propiedades. Un objeto puede tener una propiedad que sea en sí misma otro objeto. Ver los ejemplos siguientes,

Cuando el código new Foo(...) es ejecutado, las siguientes cosas pasan:

  1. Un nuevo objeto es creado, este hereda de  Foo.prototype.
  2. La función de construcción (constructor) es llamada con los argumentos especificados, y con el objeto this atado al objeto recien creado. new Foo es equivalente a new Foo(), i.e. si no hay una lista de argumentos especificada, Foo es llamada sin argumentos.
  3. El objeto regresado por la función de construcción (constructor) se convierte en el resultado la expresión new. Si la función de construcción no regresa explicitamente un objeto, el objeto creado en el paso 1 será regresado en su lugar. (Normalmente las funciones de construcción no regresan un valor, pero pueden elegirlo si quieren sobreescribir el proceso de creación de objetos normal.)

Siempre puedes agregar una propiedad a un objeto definido previamente. Por ejemplo, la sentencia car1.color = "black" agrega la propiedad color a car1, y asigna su valor a "black". Sin embargo, esto no afecta a cualquier otro objeto. Para agregar una propiedad nueva a todos los objeto del mismo tipo, debes agregar la propiedad a la definición del objeto tipo Car.

Puedes agregar una propiedad compartida a un tipo de objeto definido previamente utilizando la propiedad Function.prototype. Esto define una propiedad que es compartida por todos los objetos creados con esa función, en lugar de solo una instancia del tipo de objeto. El siguiente código agrega una propiedad color con el valor null a todos los objetos de tipo car, y luego sobreescribe el valor con la cadena "black" solo en la instancia del objeto car1. Para más informllación, puedes ver prototype.

function Car() {}
car1 = new Car();
 
console.log(car1.color);    // undefined
 
Car.prototype.color = null;
console.log(car1.color);    // null
 
car1.color = "black";
console.log(car1.color);   // black

Ejemplos

Tipo de objeto instancia de objeto

Supongamos que quieres crear un tipo de objeto para carros. Quieres que este tipo de objeto se llame car, y quieres que tenga las propiedades fabricante, modelo y anio. Para hacer esto, tendrías que escribir la siguiente función.

function Carro(fabricante, model, year) {
  this.fabricante = fabricante;
  this.modelo = modelo;
  this.anio = anio;
}

Ahora puedes crear un objeto llamado mycar de la siguiente manera:

var mycar = new Carro("Eagle", "Talon TSi", 1993);

Esta declaración crea mycar y le asigna los valores especificados a sus propiedades. Luego el valor mycar.fabricante es la cadena "Eagle", mycar.anio es el entero 1993, y así.

Puedes crear cualquier numero de objetos car haciendo llamadas a new. Por ejemplo:

var kenscar = new Carro("Nissan", "300ZX", 1992);

Propiedad de objeto que es otro objeto

Supongamos que defines un objeto llamdo  person:

function Person(name, age, sex) {
  this.name = name;
  this.age = age;
  this.sex = sex;
}

Y luego creamos dos instancions nuevos del objeto new person:

var rand = new Person("Rand McNally", 33, "M");
var ken = new Person("Ken Jones", 39, "M");

Luego reescribes la definición de car para incluir una propiedad dueño (owner) que toma un objeto person:

function Car(make, model, year, owner) {
  this.make = make;
  this.model = model;
  this.year = year;
  this.owner = owner;
}

Para crear nuevas instancias del objeto car haces lo siguiente:

var car1 = new Car("Eagle", "Talon TSi", 1993, rand);
var car2 = new Car("Nissan", "300ZX", 1992, ken);

En lugar de pasar una cadena literal o un valor entero cuando se crean los nuevos objetos, las declaraciones de abajo pasan los objetos rand y ken como los parametros de los dueños. Para encontrar el nombre del dueño de car2, tienes que acceder a la siguiente propiedad:

car2.owner.name

Specifications

Specification Status Comment
{{SpecName('ESDraft', '#sec-new-operator', 'The new Operator')}} {{Spec2('ESDraft')}}  
{{SpecName('ES6', '#sec-new-operator', 'The new Operator')}} {{Spec2('ES6')}}  
{{SpecName('ES5.1', '#sec-11.2.2', 'The new Operator')}} {{Spec2('ES5.1')}}  
{{SpecName('ES3', '#sec-11.2.2', 'The new Operator')}} {{Spec2('ES3')}}  
{{SpecName('ES1', '#sec-11.2.2', 'The new Operator')}} {{Spec2('ES1')}} Initial definition. Implemented in JavaScript 1.0.

Compatibilidad entre navegadores

{{CompatibilityTable}}

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
Basic support {{CompatVersionUnknown}} {{CompatVersionUnknown}} {{CompatVersionUnknown}} {{CompatVersionUnknown}} {{CompatVersionUnknown}}
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support {{CompatVersionUnknown}} {{CompatVersionUnknown}} {{CompatVersionUnknown}} {{CompatVersionUnknown}} {{CompatVersionUnknown}} {{CompatVersionUnknown}}

See also

  • {{jsxref("Function")}}
  • {{jsxref("Reflect.construct()")}}

Revision Source

<div>{{jsSidebar("Operators")}}</div>

<p>El <strong>&nbsp;operador</strong> <strong><code>new </code></strong>crea&nbsp;una instancia de un objeto definido por el usuario o uno de los tipos de&nbsp;objetos incorporados que tienen una función de construcción.</p>

<h2 id="Sintaxis">Sintaxis</h2>

<pre class="syntaxbox">
new <em>constructor</em>[([<em>argumentos</em>])]</pre>

<h3 id="Parametros">Parametros</h3>

<dl>
 <dt><code>constructor</code></dt>
 <dd>Una función que especifica el tipo de la instancia del objeto.</dd>
</dl>

<dl>
 <dt><code>argumentos</code></dt>
 <dd>Una lista de valores que serán llamados con el&nbsp;<code>constructor</code>.</dd>
</dl>

<h2 id="Descripción">Descripción</h2>

<p>Crear un objeto definido por el usuario requiere dos pasos:</p>

<ol>
 <li>Definir el tipo de objeto escribiendo una función.</li>
 <li>Crear una instancia del objeto con new.</li>
</ol>

<p>Definir un tipo de objeto, crear una función para el tipo de objeto que especifique su nombre y sus propiedades. Un objeto puede tener una propiedad que sea en sí misma otro objeto. Ver los ejemplos siguientes,</p>

<p>Cuando el código <code>new <em>Foo</em>(...)</code>&nbsp;es ejecutado, las siguientes cosas pasan:</p>

<ol>
 <li>Un nuevo objeto es creado, este hereda de &nbsp;<code><em>Foo</em>.prototype</code>.</li>
 <li>La función de construcción (<code>constructor</code>) es llamada con los argumentos especificados, y con el objeto&nbsp;<code><a href="/en-US/docs/Web/JavaScript/Reference/Operators/this">this</a></code>&nbsp;atado al objeto recien creado. <code>new F<em>oo</em></code>&nbsp;es equivalente a&nbsp;<code>new </code><em>F<code>oo</code></em><code>()</code>, i.e. si no hay una lista de argumentos especificada,&nbsp;<em>F<code>oo</code></em> es llamada sin argumentos.</li>
 <li>El objeto regresado por la función de construcción&nbsp;(<code>constructor)</code>&nbsp;se convierte en el resultado la expresión&nbsp;<code>new</code>. Si la función de construcción no regresa explicitamente un objeto, el objeto creado en el paso 1 será regresado en su lugar.&nbsp;(Normalmente las funciones de construcción no regresan un valor, pero pueden elegirlo si quieren sobreescribir el proceso de creación de objetos normal.)</li>
</ol>

<p>Siempre puedes agregar una propiedad a un objeto definido previamente. Por ejemplo, la sentencia&nbsp;<code>car1.color = "black"</code> agrega la propiedad&nbsp;<code>color</code>&nbsp;a&nbsp;<code>car1</code>, y asigna su valor a "black". Sin embargo, esto no afecta a cualquier otro objeto.&nbsp;Para agregar una propiedad nueva a todos los objeto del mismo tipo, debes agregar la propiedad a la definición del objeto&nbsp;tipo&nbsp;<code>Car</code>.</p>

<p>Puedes agregar una propiedad compartida a un tipo de objeto definido previamente utilizando la propiedad&nbsp;<code><a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/prototype">Function.prototype</a></code>. Esto define una propiedad que es compartida por todos los objetos creados con esa función, en lugar de solo una instancia del tipo de objeto. El siguiente código agrega una propiedad color con el valor <code>null</code>&nbsp;a todos los objetos de tipo car, y luego sobreescribe el valor con la cadena "<code>black</code>" solo en la instancia del objeto&nbsp;<code>car1</code>. Para más informllación, puedes ver&nbsp;<a href="/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/prototype">prototype</a>.</p>

<pre class="brush: js">
function Car() {}
car1 = new Car();
 
console.log(car1.color);    // undefined
 
Car.prototype.color = null;
console.log(car1.color);    // null
 
car1.color = "black";
console.log(car1.color);   // black
</pre>

<h2 id="Ejemplos">Ejemplos</h2>

<h3 id="Tipo_de_objeto_instancia_de_objeto">Tipo de objeto instancia de objeto</h3>

<p>Supongamos que quieres crear un tipo de objeto para carros. Quieres que este tipo de objeto se llame <code>car</code>, y quieres que tenga las propiedades fabricante, modelo y anio. Para hacer esto, tendrías que escribir la siguiente función.</p>

<pre class="brush: js">
function Carro(fabricante, model, year) {
  this.fabricante = fabricante;
  this.modelo = modelo;
  this.anio = anio;
}
</pre>

<p>Ahora puedes crear un objeto llamado <code>mycar</code>&nbsp;de la siguiente manera:</p>

<pre class="brush: js">
var mycar = new Carro("Eagle", "Talon TSi", 1993);
</pre>

<p>Esta declaración crea <code>mycar</code>&nbsp;y le asigna los valores especificados a sus propiedades. Luego el valor <code>mycar.fabricante</code>&nbsp;es&nbsp;la cadena&nbsp;"Eagle", <code>mycar.anio</code>&nbsp;es el entero&nbsp;1993, y así.</p>

<p>Puedes crear cualquier numero de objetos <code>car</code>&nbsp;haciendo llamadas a new. Por ejemplo:</p>

<pre class="brush: js">
var kenscar = new Carro("Nissan", "300ZX", 1992);
</pre>

<h3 id="Propiedad_de_objeto_que_es_otro_objeto">Propiedad de objeto que es otro objeto</h3>

<p>Supongamos que defines un objeto llamdo&nbsp;&nbsp;<code>person</code>:</p>

<pre class="brush: js">
function Person(name, age, sex) {
  this.name = name;
  this.age = age;
  this.sex = sex;
}
</pre>

<p>Y luego creamos dos instancions nuevos del objeto new <code>person</code>:</p>

<pre class="brush: js">
var rand = new Person("Rand McNally", 33, "M");
var ken = new Person("Ken Jones", 39, "M");
</pre>

<p>Luego reescribes la definición de <code>car</code>&nbsp;para incluir una propiedad dueño (<code>owner)</code>&nbsp;que toma un objeto <code>person</code>:</p>

<pre class="brush: js">
function Car(make, model, year, owner) {
  this.make = make;
  this.model = model;
  this.year = year;
  this.owner = owner;
}
</pre>

<p>Para crear nuevas instancias del objeto <code>car</code> haces lo siguiente:</p>

<pre class="brush: js">
var car1 = new Car("Eagle", "Talon TSi", 1993, rand);
var car2 = new Car("Nissan", "300ZX", 1992, ken);
</pre>

<p>En lugar de pasar una&nbsp;cadena literal o un valor entero cuando se crean los nuevos objetos, las declaraciones de abajo pasan los objetos&nbsp;<code>rand</code>&nbsp;y&nbsp;<code>ken</code>&nbsp;como los parametros de los dueños. Para encontrar el nombre del dueño de&nbsp;<code>car2,</code>&nbsp;tienes que acceder a la siguiente propiedad:</p>

<pre class="brush: js">
car2.owner.name
</pre>

<h2 id="Specifications">Specifications</h2>

<table class="standard-table">
 <tbody>
  <tr>
   <th scope="col">Specification</th>
   <th scope="col">Status</th>
   <th scope="col">Comment</th>
  </tr>
  <tr>
   <td>{{SpecName('ESDraft', '#sec-new-operator', 'The new Operator')}}</td>
   <td>{{Spec2('ESDraft')}}</td>
   <td>&nbsp;</td>
  </tr>
  <tr>
   <td>{{SpecName('ES6', '#sec-new-operator', 'The new Operator')}}</td>
   <td>{{Spec2('ES6')}}</td>
   <td>&nbsp;</td>
  </tr>
  <tr>
   <td>{{SpecName('ES5.1', '#sec-11.2.2', 'The new Operator')}}</td>
   <td>{{Spec2('ES5.1')}}</td>
   <td>&nbsp;</td>
  </tr>
  <tr>
   <td>{{SpecName('ES3', '#sec-11.2.2', 'The new Operator')}}</td>
   <td>{{Spec2('ES3')}}</td>
   <td>&nbsp;</td>
  </tr>
  <tr>
   <td>{{SpecName('ES1', '#sec-11.2.2', 'The new Operator')}}</td>
   <td>{{Spec2('ES1')}}</td>
   <td>Initial definition. Implemented in JavaScript 1.0.</td>
  </tr>
 </tbody>
</table>

<h2 id="Compatibilidad_entre_navegadores">Compatibilidad entre navegadores</h2>

<p>{{CompatibilityTable}}</p>

<div id="compat-desktop">
<table class="compat-table">
 <tbody>
  <tr>
   <th>Feature</th>
   <th>Chrome</th>
   <th>Firefox (Gecko)</th>
   <th>Internet Explorer</th>
   <th>Opera</th>
   <th>Safari</th>
  </tr>
  <tr>
   <td>Basic support</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
  </tr>
 </tbody>
</table>
</div>

<div id="compat-mobile">
<table class="compat-table">
 <tbody>
  <tr>
   <th>Feature</th>
   <th>Android</th>
   <th>Chrome for Android</th>
   <th>Firefox Mobile (Gecko)</th>
   <th>IE Mobile</th>
   <th>Opera Mobile</th>
   <th>Safari Mobile</th>
  </tr>
  <tr>
   <td>Basic support</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
   <td>{{CompatVersionUnknown}}</td>
  </tr>
 </tbody>
</table>
</div>

<h2 id="See_also">See also</h2>

<ul>
 <li>{{jsxref("Function")}}</li>
 <li>{{jsxref("Reflect.construct()")}}</li>
</ul>
Revert to this revision