L'operatore new crea un'istanza di un tipo di oggetto definito dall'utente o di uno dei tipi di oggetto nativi che ha una funzione costruttore.
Sintassi
new constructor[([arguments])]
Parametri
constructor- Una funzione che specifica il tipo dell'oggetto istanziato.
arguments- Una lista di valori con i quali
constructorsarà chiamato.
Descrizione
Creare un oggetto definito dall'utente richiede due step:
- Definire il tipo di oggetto scrivendo una funzione.
- Creare un'istanza dell'oggetto con
new.
Per definire un tipo di oggetto, crea una funzione per il tipo di oggetto che specifichi il suo nome e le sue proprietà. Un oggetto può avere una proprietà che è se stessa un oggetto. Vedi l'esempio sotto.
Quando il codice new Foo(...) viene eseguito, ecco cosa accade:
- Un nuovo oggetto viene creato ed eredita da
Foo.prototype. - La funzione costruttore Foo viene chiamata con gli argomenti specificati e con
thislegato all'oggetto appena creato.new Fooè identica anew Foo(), ovvero se nessun argomento è specificato, Foo viene chiamato senza argumenti. - L'oggetto ritornato dalla funzione costruttore diventa il risultato dell'intera espressione
new. Se la funzione costruttore non ritorna esplicitamente un oggetto, viene invece usato l'oggetto creato nello step 1. (Normalmente i costruttori non ritornano un valore, ma possono scegliere di farlo se vogliono sovrascrivere il processo di creazione di un normale oggetto).
Puoi sempre aggiungere una proprietà all'oggetto che hai creato precedentemente. Per esempio, la dichiarazione car1.color = "black" aggiunge una proprietà color a car1, e gli assegna il valore di "black". Tuttavia, questo non influenza nessun altro oggetto. Per aggiungere una nuova proprietà a tutti gli oggetti dello stesso tipo, devi aggiungere la proprietà alla definizione del tipo di oggetto, in questo caso Car.
Puoi aggiungere una proprietà condivisa ad un tipo di oggetto che hai definito prima usando la proprietà Function.prototype.
Questo definisce una proprietà che è condivisa da tutti gli oggetti creati con quella funzione, piuttosto che solo da un'istanza di quel tipo di oggetto. Il seguente codice aggiunge una proprietà con il valore null a tutti gli oggetti di tipo car, e poi sovrascrive quel valore con la stringa "black" solo nell'oggetto istanza car1. Per altre informazioni, vedi prototype.
function Car() {}
car1 = new Car();
car2 = new Car();
console.log(car1.color); // undefined
Car.prototype.color = "original color";
console.log(car1.color); // original color
car1.color = 'black';
console.log(car1.color); // black
console.log(car1.__proto__.color) //original color
console.log(car2.__proto__.color) //original color
console.log(car1.color) // black
console.log(car2.color) // original color
Se non hai usato l'operatore new, la funzione constructor verrà invocata come una qualunque altra funzione, senza creare un nuovo Object. in questo caaso, anche il valore di this è diverso.
Esempi
Tipo di oggetto e oggetto istanza
Metti caso di volere creare un tipo di oggetto per le macchine. Vuoi che questo tipo di oggetto si chiami car, e vuoi che abbia queste proprietà: make (brand, marca), model (modello) e year (anno). Per fare questo, potresti scrivere la seguente funzione:
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
Adesso puoi creare un oggetto chiamato myCar in questo modo:
var mycar = new Car("Eagle", "Talon TSi", 1993);
Questa dichiarazione crea myCar e gli assegna i valori specificati per le sue proprietà. Poi il valore di mycar.make è "Eagle", mycar.year è il numero intero 1993, e così via.
Puoi creare quanti oggetti Car vuoi utilizzando new. Per esempio:
var kenscar = new Car("Nissan", "300ZX", 1992);
Proprietà dell'oggetto che è se stesso un oggetto
Supponi di definire un oggetto person in questo modo:
function Person(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
E poi istanzi due nuove oggetti Person in questo modo:
var rand = new Person("Rand McNally", 33, "M");
var ken = new Person("Ken Jones", 39, "M");
Poi puoi riscrivere la definizione di Car per includere una proprietà owner (proprietario) che accetta un oggetto persona, ecco come:
function Car(make, model, year, owner) {
this.make = make;
this.model = model;
this.year = year;
this.owner = owner;
}
Per istanziare i nuovi oggetti, poi fai così:
var car1 = new Car("Eagle", "Talon TSi", 1993, rand);
var car2 = new Car("Nissan", "300ZX", 1992, ken);
Invece di passare una stringa letterale o un valore intero quando crei i nuovi oggetti, le dichiarazioni sopra passano gli oggetti rand e ken come parametri per i proprietari. Per cercare il nome del proprietario (owner) in car2, puoi accedere alla seguente proprietà:
car2.owner.name
Specifiche
| Specifiche | Status | Commento |
|---|---|---|
| ECMAScript Latest Draft (ECMA-262) The definition of 'The new Operator' in that specification. |
Draft | |
| ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'The new Operator' in that specification. |
Standard | |
| ECMAScript 5.1 (ECMA-262) The definition of 'The new Operator' in that specification. |
Standard | |
| ECMAScript 3rd Edition (ECMA-262) The definition of 'The new Operator' in that specification. |
Standard | |
| ECMAScript 1st Edition (ECMA-262) The definition of 'The new Operator' in that specification. |
Standard | Initial definition. Implemented in JavaScript 1.0. |
Compatibilità browser
| Desktop | Mobile | Server | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
new | Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | IE Full support 3 | Opera Full support Yes | Safari Full support Yes | WebView Android Full support 1 | Chrome Android Full support 18 | Firefox Android Full support 4 | Opera Android Full support Yes | Safari iOS Full support Yes | Samsung Internet Android Full support 1.0 | nodejs Full support Yes |
Legend
- Full support
- Full support