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);
{no: 'nothing'},不是敲下new时生成的那个对象Person{}
所以构造函数的首字母一定要大写,在开发者没有忘写new时会提醒开发者。
不写new,没有返回值,brynn就是空值。
PS:我之前一直在想,为什么有的对象有名字,有的对象没有。就比如上面的例子中,第一次打出来的对象前写了
Person,第二次没有。
思考了一下,有名字的,是new出来的,没有名字的,是直接用大括号定义出来的。
因为只有函数这个特殊的对象是有name属性(这里的就是函数名Person),所以用构造函数生成的对象也会带有这个属性。(如果不对请给我留言,谢!)