一、es6中的箭头函数和普通函数有什么区别?
1
.普通函数中的 this总是指向调用它的那个对象,
箭头函数没有自己的this,他的this永远指向其定义环境,任何方法都改变不了其指向,如call()、bind()、apply()。(正是因为它没有this,所以也就不能用作构造函数,也没有原型对象)
2
. 箭头函数不能当作构造函数,也就是说,不能使用new命令,否则会报错。
3
. 箭头函数没有原型属性。
4
. 箭头函数不可以使用yield命令,因此箭头函数不能用作Generator函数。
5
. 箭头函数不能使用arguments对象,该对象在函数体内不存在。如果要用,可以用rest参数代替。
6
. 变量提升:由于js的内存机制,function的级别最高,而用箭头函数定义函数的时候,需要var(let、const)关键字,而var所定义的变量不能得到变量提升。故箭头函数一定要定义于调用之前。
拓展:this的指向问题?
1
、普通函数中,this指向其函数的直接调用者;
2
、箭头函数中,this指向其定义环境,任何方法都改变不了其指向,如call( )、bind()等;
3
、构造函数中,如果不使用new,则this指向window,
如果使用new创建了一个实例,则this指向该实例。
4
、window 内置函数中,如setInterval,setTimeout等,其内部的this指向Window。
5
、匿名函数的this指向Window。
6
、apply()、call()、bind()可以改变this的指向
二、谈谈你对原型链的认识?
对象:1 、 函数对象
: 由 function 创造出来的函数,比如 function a(){ } ; 系统内置的函数对象: Function , Object , Array , String , Number
2、 普通对象
: 除开函数对象之外的对象,都是普通对象
每个普通对象的__proto__属性,都指向 Object().prototype ,
var obj = { } 就等于 var obj = new Object ( ) ; 即普通对象是 构造函数( Object ) 的一个实例
所以 obj. proto == Object.prototype ( 但是老高说的,Object的原型还是object对象, )
obj. constructor == Object
凡是通过 new Function() 创建的对象都是函数对象,其他的都是普通对象。
注:所有对象都有 proto 属性 只有函数对象才有 prototype 属性 !!!!!!!!!!!
原型对象
: prototype 属性也叫原型对象,主要是为了实现继承;
指针 __proto__
: js中,万物皆对象!所有的对象 obj 都具有 proto 属性(null 和 undefined除外 ),而且指向创造obj 对象的函数对象(生成实例的构造函数)的prototype属性 。 如以下例子:
Person 构造函数的原型对象 是 Mother ()。相当于原型是妈妈,Person现在是儿子。
在默认情况下,所有的原型对象都会自动获得一个 constructor(构造函数)属性,这个属性(是一个指针)指向 prototype 属性所在的函数(Person)
结论: 原型对象
(Person.prototype)是 构造函数
(Person)的一个实例。
以下是 深入解答原型是怎么回事 的一篇文章
1、https://www.jianshu.com/p/dee9f8b14771
2、https://www.jianshu.com/p/652991a67186
3、https://www.jianshu.com/p/a4e1e7b6f4f8
原型链的概念
如果问原型链是什么,直接把下面的这张图画出来就行了。
https://www.cnblogs.com/shuiyi/p/5305435.html
回答出以下问题,就知道 __proto__和prototype 的什么了
function Person(){ } ; var person1 = new Person( );
- person1.proto 是什么?
- Person.proto 是什么?
- Person.prototype.proto 是什么?
- Object.proto 是什么?
- Object.prototype__proto__ 是什么?
答案:
第一题
:
因为 person1.proto === person1 的构造函数.prototype
因为 person1的构造函数 === Person
所以 person1.proto === Person.prototype
第二题
:
因为 Person.proto === Person的构造函数.prototype
因为 Person的构造函数 === Function
所以 Person.proto === Function.prototype
第三题
:
Person.prototype 是一个普通对象,我们无需关注它有哪些属性,只要记住它是一个普通对象。
因为一个普通对象的构造函数 === Object
所以 Person.prototype.proto === Object.prototype
第四题
,参照第二题,因为 Person 和 Object 一样都是构造函数
不要把 Object 想的太复杂,它其实也不过是 Function 构造出来的一个 方法 (一个普通的构造函数)
所以 Object.proto === Function.prototype
第五题
:
Object.prototype 对象也有proto属性,但它比较特殊,为 null 。因为 null 处于原型链的顶端,这个只能记住。
Object.prototype.proto === null
记住:prototype是一个普通对象,所有普通对象的__protp__都指向 Object.prototype