-
Notifications
You must be signed in to change notification settings - Fork 45
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Day7 - 分析一下箭头语法为什么不能当做构造函数 #25
Comments
箭头函数中的this指向上一层级的作用域,构造函数中的this指向当前函数的作用域,两者间的this指向不同,所以箭头函数是不能够作为构造函数的 |
因为箭头函数没有自己的 |
分析一下箭头语法为什么不能当做构造函数更正答案: function Person() {}
console.log(Person.prototype); // {constructor: ƒ}
let Animal = () => {};
console.log(Animal.prototype); // undefined 注意点:
|
箭头函数的 this 是在定义是就确定的,用的是父作用域的 this,其本身没有 this |
主要原因是因为性质问题,箭头函数的this指向的是全局对象,构造函数模式创建的this对象需要指向当前的对象。 箭头函数没有prototype。 构造函数模式在生成的时候主要依赖于原型继承链来关联相关的关系,而箭头函数没有,因此不行。 |
|
箭头函数在其他语言里叫做lambda表达式,是一种函数式编程风格,而new是一种面向对象的编程风格。所以箭头函数不支持new调用也显得比较合理。 |
分析一下箭头语法为什么不能当做构造函数
|
箭头函数本身没有this,因此不能使用箭头作为构造函数,也就不能通过 new 操作符来调用箭头函数。 |
构造函数是通过new关键字来生成对象实例,生成对象实例的过程也是通过构造函数给实例绑定this的过程,而箭头函数没有自己的this。创建对象过程,new 首先会创建一个空对象,并将这个空对象的__proto__指向构造函数的prototype,从而继承原型上的方法,但是箭头函数没有prototype。因此不能使用箭头作为构造函数,也就不能通过new操作符来调用箭头函数。 |
结论js里面每个非箭头函数都有两个内部方法,一个是[[call]],另一个是[[construct]],在不是用new进行调用函数时,函数会调用内部的[[call]]方法,而使用new调用时,函数会调用内部的[[construct]]方法 对于箭头函数来说,箭头函数是没有[[construct]]的内部方法的,这个才是箭头函数不能作为构造函数的真正原因 引申箭头函数中的this、super、arguments及new.target这些值由外围最近一层非箭头函数决定 因为不能通过new关键字调用,没有构造原型的需求,所以箭头函数不存在prototype属性 箭头函数没有自己的arguments对象,它始终可以访问外围函数的arguments对象 |
箭头函数的 this 是在定义是就确定的,用的是父作用域的 this,其本身没有 this |
在使用function定义函数时,可以在函数内部访问arguments对象,从中取得传进来的每个参数值,如果函数是使用箭头函数定义的,那么传给函数的参数不能使用arguments关键字访问,而只能通过定义的命名参数访问 |
|
在使用function定义函数时,可以在函数内部访问arguments对象,从中取得传进来的每个参数值,如果函数是使用箭头函数定义的,那么传给函数的参数不能使用arguments关键字访问,而只能通过定义的命名参数访问 |
首先箭头函数没有自己的this,而是继承父作用域的this。 |
1.在箭头函数中,this指向的是定义时所在的对象,而不是使用时所在的对象。换句话说,箭头函数没有自己的this,而是继承父作用域中的this。 2.创建对象过程,new 首先会创建一个空对象,并将这个空对象的__proto__指向构造函数的prototype,从而继承原型上的方法,但是箭头函数没有prototype。因此不能使用箭头作为构造函数,也就不能通过new操作符来调用箭头函数。 |
|
为什么箭头函数不能当做构造函数? |
new 构造函数的时候会将 this 绑定为生成的实例对象,但是箭头函数没有自己的 this,是引用的外部的 this,就连 bind, call 这些也没办法修改 this,那 new 自然也没办法修改。所以就无法作为构造函数。假设真的构造了,变量就都存到外面的 this去了。返回的实例也是外面的this。 |
所以箭头函数不能做构造函数 |
什么是箭头函数 |
实际上,js里面每个非箭头函数都有两个内部方法,一个是[[call]],另一个是[[construct]],在不是用new进行调用函数时,函数会调用内部的[[call]]方法,而使用new调用时,函数会调用内部的[[construct]]方法。 |
当new一个构造函数,首先需要创建一个对象,然后修改this指向新创建的对象,再把构造函数的prototype属性赋值给新创建对象的__proto__ |
不能 |
箭头函数为什么不能作为构造函数? 因为箭头函数不具备作为一个构造函数,能通过new去创建实例的必备条件。箭头函数没有prototype,也没有自己的this,是引用的上层非箭头函数的this,也不能通过call,aply改变this指向。 我们在new一个实例的时候,会发生以下几步:
而前面也说过构造函数既没有prototype也不能改变this指向,所以不能完成实例化过程 ,自然也不能作为构造函数。 |
构造函数调用需要一个prototype属性,而箭头函数定义的函数没有prototype属性,因此不能作为构造函数使用。而且,箭头函数中的this是从定义它们的上下文继承的,不会根据调用它们的对象来动态设置。这样定义的方法就不能用了,因为方法的典型特点就是使用this引用调用它们的实例。 |
箭头函数不能用做构造函数,是因为new会创建一个空对象,并将这个空对象的_proto_指向构造函数的prototype,从而继承原型上的方法,但是箭头函数没有prototype,所以箭头函数不能用做构造函数。 |
本质原因,缺少[construct]方法 构造函数生来就是被new的, 如果不new它将毫无意义。那么就回到了我们上次new会发生什么事情。其中this的指向固然是丢失的,但是不影响程序的运行,顶多数据混乱了。其次constructor方法被调用,这一步会报错,也就不会往下执行了,不能被new,所以箭头函数也无需拥有prototype属性。 |
箭头函数不能用作构造函数是因为,箭头函数创建的时候不会为其创建[[construct]]方法,意味着没有构造能力,所以自然不能调用new来生成实例,所以箭头函数的prototype属性也没有必要存在了。
|
箭头函数为什么不能new首先 然后 箭头函数 没有内部[[Construct]] 这个构造器方法,所以不能new
|
1、this指向的是定义时所在的对象。换句话说,箭头函数没有自己的this,而是继承父作用域中的this |
因为箭头函数的 [[thisMode]] 私有属性是 lexical,表示从上下文中找 this 值,如果箭头函数当构造函数,实例化的对象内部的函数调用时的 this 值不会指向该对象,所以不能做构造函数。 |
一句话答案因为箭头函数没有 [[Construct]]。 进一步解释函数对象是一个支持[[Call]] 、 [[Construct]]内部方法的对象。每个支持[[Construct]]的对象必须支持[[Call]],也就是说,每个构造函数必须是一个函数对象。因此,构造函数也可以被称为 构造函数函数 或 构造函数对象。 为什么没有 [[Construct]]因为箭头函数设计之初,就是为了设计一种更简短的函数并且不绑定 而这样的一个函数设计者认为没有必要委托给能够 [[Construct]] 的目标函数。所以箭头函数没有 [[Construct]]。 |
箭头函数不能当做构造函数的原因
|
构造函数调用的过程中会创建新的对象,并且把函数的prototype属性设置为新对象的原型。 箭头函数它本身是没有prototype属性的,这是一方面。第二个方面,箭头函数也没有本地的this用来创建新对象。所以,箭头函数既没有新对象又没有原型,这两大对于构造函数最重要的特征,那么因此,他就没有办法用来当作构造函数。 |
箭头函数不能用作构造函数,与new一起使用会报错。 箭头函数有以下特点:
那么假设我们new一个箭头函数,我们会面临几个问题
|
|
构造函数是通过new关键字来生成实例对象,将一个空对象的__proto__指向构造函数的prototype,但是箭头函数没有prototype属性,所以不能作为构造函数调用;另外生成对象实例的过程也是通过构造函数给实例绑定this的过程,而箭头函数也没有自己的this,如果new关键字生成箭头函数的实例对象,这是行不通的 |
构造函数是通过new关键字来生成实例对象,将一个空对象的__proto__指向构造函数的prototype,但是箭头函数没有prototype属性,所以不能作为构造函数调用;另外生成对象实例的过程也是通过构造函数给实例绑定this的过程,而箭头函数也没有自己的this,所以不能用new关键字生成箭头函数的实例对象 |
The text was updated successfully, but these errors were encountered: