JavaScript:详解new

228 阅读2分钟

tip:由于V8在浏览器和node中有一点小区别,本篇的代码请使用node,原因可以见异步这篇文章(没有这篇,我还没写)

new

发生的所有事:生成一个空对象
new=生成一个空对象

构造函数

在new后面跟着的是一个构造函数,构造函数往往首字母会大写。
构造函数跟其他函数一样,也是一个函数,但它不能有返回值

function Person(firstname, lastname) {
    console.log(this);
    this.firstname = firstname;
    this.lastname = lastname;
    console.log('This function is invoked.');
}
var brynn = new Person('Brynn', 'Brown');
console.log(brynn);

var boolean = new Person('Boolean', 'Brown');
console.log(boolean);

可以看到,在构造函数执行之前,得到的是一个空对象Person{}

this.firstname = firstname;
this.lastname = lastname;

但在上面两行代码执行之后,这个空对象对象有了两个属性。 Person { firstname: 'Brynn', lastname:'Brown' }

并且每一次执行构造函数,会有一块新的内存开辟——brynn和boolean是放在内存中两个不同的位置上的。

构造函数一定不能有返回值

构造函数和上面一样,只是加一个返回值,返回一个对象,里面是一个属性no: 'nothing'

function Person(firstname, lastname) {

    console.log(this);
    this.firstname = firstname;
    this.lastname = lastname;
    console.log('This function is invoked.');
    return {
        no:'nothing'
    }
    
}
var brynn = new Person('Brynn', 'Brown');
console.log(brynn);

可以看到,brynn这个对象最后成了构造函数返回的东西{no: 'nothing'},不是敲下new时生成的那个对象Person{}

所以构造函数的首字母一定要大写,在开发者没有忘写new时会提醒开发者。
不写new,没有返回值,brynn就是空值。

相关内容:对比构造函数和类

PS:我之前一直在想,为什么有的对象有名字,有的对象没有。就比如上面的例子中,第一次打出来的对象前写了Person,第二次没有。
思考了一下,有名字的,是new出来的,没有名字的,是直接用大括号定义出来的。
因为只有函数这个特殊的对象是有name属性(这里的就是函数名Person),所以用构造函数生成的对象也会带有这个属性。(如果不对请给我留言,谢!)