提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
JS中new关键字是什么?
它有哪些作用?
一、new关键字的定义
new fn() new关键字后面跟函数 是一个表达式(运算符) 创建对象的运算 整个表达式一定会得到一个对象并且给它添加一个属性 proto 这个属性引用fn.prototype
二、new关键字的作用
- 创建一个空对象 ,给它添加一个属性 proto 这个属性引用fn.prototype
- 运行构造函数,让内部的this指向创建的对象(用创建的空对象去调用构造函数)
- 整个表达式的结果看函数的返回值:
3.1返回值是引用数据 那么就是返回值
3.2返回值不是引用数据 那么就是这个运行完毕之后的创建的那个对象
三、实例
实例1
function fm(name) {
this.name = name
return fm
}
var re=new fm("ljy")
console.log(re) //打印什么?
分析: 首先判断返回值是引用数据,所以结果返回的是fm函数之后;打印的就是这个函数
ƒ fm(name) {
this.name = name
return fm
}
实例2
function fn() {
var obj={say:function(){
return obj
}}
return obj
}
var re=new fn()
var re2=fn().say
var re3=new re2()
console.log(re)
console.log(re2)
console.log(re3)
//分别打印什么
分析: 首先判断返回值是引用数据,所以结果返回obj
所以console.log(re)打印的内容为
{say:function(){
return obj
}}
var re2=fn().say 意思是调用这个fn函数然后得到结果的say属性值赋给re2
fn()调用得到返回值obj对象,obj.say得到function(){return obj}值
所以console.log(re2)打印内容为
function(){
return obj
}
实例3
function Parent() {
this.a = 1;
this.b = [1, 2, this.a];
this.c = {
demo: 5
};
this.show = function() {
console.log(this.a, this.b, this.c.demo);
}
this.change = function() {
this.a = this.b.length;
this.c.demo = this.a++;
}
}
var parent = new Parent();
parent.change();
parent.show();
分析: 首先判断返回值不是引用数据,所以parent就是Parent()函数运行完毕之后的对象,函数里面的this都是parent
parent.change() 意思是调用parent对象的change属性,因为change保存的是函数;运行代码this.a = this.b.length; this.c.demo = this.a++;后得出 parent.a=3;parent.c.demo=3 因为a++是先取值后自增,所以a自加1 a=4
注意: parent.b = [1, 2, this.a] 这里的this.a是先存值所以得出parent.b = [1, 2, 1]
最后parent.show();调用show函数打印出结果为: 4,[1, 2, 1] ,3