js的new运算符详解

new 后面需要跟一个函数(此时这个函数就称作构造函数)用来创建并初始化对象。这种方式创建的对象分两种,一种是js本身的内置构造函数,一种是用户自定义的构造函数。

1.内置构造函数

var obj=new Object();
var arr=new Array();
var date=new Date();
var reg=new RegExp();
......
等等

此外 string、number 和 boolean 这三个原始类型对应的 new String()、new Number() 和 new Boolean() 被创建出来的特别被称为 包装对象【关联:js的包装对象】

2.自定义构造函数

一般用这个自定义类,约定首字母大写,以方便判断是不是配合 new 创建对象用的,不然其自身作为普通的函数调用是没什么意义的。

通过 new 自定义对象只需要两步:
(1)编写一个函数定义对象类型(以下定义了 Vegetable 类型);
(2)使用 new 创建对象实例。

var Vegetable = function () {   //蔬菜类
    this.spinage = 'spinage';
}
Vegetable.prototype.stock = function (name) {
    this[name] = name;
}
Vegetable.prototype.eat = function (name) {
    delete this[name];
}
var vege = new Vegetable();

vege.stock('potato');
vege.stock('spinage');

var Animal=function(params){    //动物类
    this.default=params;
}
Animal.prototype.eat=function(name){   
    this[name]=name;
}
var cat=new Animal({legs:4,color:'blue'});

3.new constructor[([arguments])] 执行过程

拿上面的 Vegetable 举例。

(1)创建继承自构造函数的新空对象——{}的 __proto__ 为 stock:f(name)、eat:f(name)、constructor:f()、__proto__:Object;
(2)运行构造函数,并将 this 指向这个新对象——运行后,this指代新对象,{}则自然变成了{spinage:spinage}, __proto__ 不变;
(3)最后(2)的新对象赋值给 vege
(4)特别有一点,如果 Vegetable 是有返回值,看下面的代码(一般不会这么写)。那么最后赋值给 vege 的就不是 (2)中的新对象,因为被返回值给覆盖掉了。这样后面的两个调用语句自然会报错,因为vege并没有继承到 Vegetable 定义的 prototype。

var Vegetable = function () {
    this.spinage = 'spinage';
    return {
      tomato:'tomato'
    }
}
Vegetable.prototype.stock = function (name) {
    this[name] = name;
}
Vegetable.prototype.eat = function (name) {
    delete this[name];
}

var vege = new Vegetable();

vege.stock('potato');  // 此时这里会报错
vege.stock('spinage');  // 此时这里会报错

4、另外两种创建对象方法

(1)对象直接量
就是直接赋值

var obj={};
var obj2={name:'amy'};
......

(2)Object.create()
以一个对象为原型创建另一个新对象。

var obj=Object.create({a:'123'});

var o={b:'b'};
var obj2=Object.create(o);

......

感谢阅读,喜欢的话点个赞吧:)
更多内容请关注后续文章。。。

你可能感兴趣的:(js的new运算符详解)