operatore new

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 constructor sar√† chiamato.

Descrizione

Creare un oggetto definito dall'utente richiede due step:

  1. Definire il tipo di oggetto scrivendo una funzione.
  2. 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:

  1. Un nuovo oggetto viene creato ed eredita da Foo.prototype.
  2. La funzione costruttore Foo viene chiamata con gli argomenti specificati e con this legato all'oggetto appena creato. new Foo √® identica a new Foo(), ovvero se nessun argomento √® specificato, Foo viene chiamato senza argumenti.
  3. 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 newla funzione constructor verr√† invocata come una qualunque altra funzionesenza 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

Compatibilità browser

BCD tables only load in the browser

Vedi anche