new操作符(翻译自mozilla.org)
翻译自:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new
new操作符可以实例化一个用户自定义对象,或者一个含有构造方法的内置对象。很明显,这句话的意思指用户采用{},或者new Object创建的对象。而后者内置对象指Function,Array,Date等。
语法
new constructor[([arguments])]
参数
constructor
构造器指指定了对象实例类型的函数。
arguments
参数指构造器调用所需要的一列值。
描述
创建一个自定义对象需要两步:
通过写个函数自定义对象类型;
使用new创建一个对象实例。
定义一个对象类型,通过创建一个函数指定它的属性和方法。一个对象可以拥有一个来自它的另一对象的属性。举例:
当代码new Foo()执行时,发生了以下事情:
一个新的对象创建,继承自Foo.prototype;
构造器函数被传参调用,并被绑定到新创建的对象,new Foo 等于 new Foo(),如果没有指定参数列表,将无参调用;
对象由构造器函数返回,成为整个新表达式的结果,如果构造器函数没有显式的返回对象,那第一步产生的对象将替代它被使用。(通常构造器函数都不返回值,也可以这么做如果想覆盖掉常规的对象创建进程)。
你随时都可以添加一个属性到先前定义的对象中。比如说,声明car1.color = "black"颜色属性到car1,并设置其值为black。然而他不会影响所有的对象。若要添加一个新属性到所有对象的类里,那么你需要将这个属性添加进所有car对象类型的定义中,也即构造函数的prototype中。
可以添加一个共享属性到先前的对象类里,通过使用函数的prototype属性。这样定义的属性将被所有来自这个类函数的实例所应用到。而不仅仅是通过单个实例对象属性设置。下面的代码添加了一个值为null的color属性到所有car实例的共享属性里,重写了仅仅在单个实例car1中定义的颜色black,更多信息,查看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
举例:
对象类和对象实例
Suppose you want to create an object type for cars. You want this type of object to be called car
, and you want it to have properties for make, model, and year. To do this, you would write the following function:
假设你想创建一个cars的对象类,这个对象类可以被调用,他拥有make,model,year属性。完成这个功能,可以如下来编写函数:
function Car(make, model, year) { this.make = make; this.model = model; this.year = year; }
好,你可以创建一个名为mycar的对象了:
var mycar = new Car("Eagle", "Talon TSi", 1993);
这个声明创建了mycar并且给定了特定属性值。
创建另外一个:
var kenscar = new Car("Nissan", "300ZX", 1992);
对象的属性值是另外一个对象:
function Person(name, age, sex) { this.name = name; this.age = age; this.sex = sex; }
var rand = new Person("Rand McNally", 33, "M"); var ken = new Person("Ken Jones", 39, "M");
function Car(make, model, year, owner) { this.make = make; this.model = model; this.year = year; this.owner = owner; }
var car1 = new Car("Eagle", "Talon TSi", 1993, rand); var car2 = new Car("Nissan", "300ZX", 1992, ken);
car1及car2对象实例的owner属性接收到了来自第三个参数的对象值。可通过类似car1.owner.name来访问。
如果函数返回值为常规意义上的值类型(Number、String、Boolean)时,new函数将会返回一个该函数的实例对象,而如果函数返回一个引用类型(Object、Array、Function),则new函数与直接调用函数产生的结果等同。