一、es6中的箭头函数和普通函数有什么区别?
1、普通函数中的 this总是指向调用它的那个对象,
箭头函数没有自己的this,他的this永远指向其定义环境,任何方法都改变不了其指向,如call()、bind()、apply()。(正是因为它没有this,所以也就不能用作构造函数,也没有原型对象)
箭头函数不能当作构造函数,也就是说,不能使用new命令,否则会报错。
箭头函数没有原型属性。
箭头函数不可以使用yield命令,因此箭头函数不能用作Generator函数。
箭头函数不能使用arguments对象,该对象在函数体内不存在。如果要用,可以用rest参数代替。
变量提升:由于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的指向
二、谈谈你对原型链的认识?
https://blog.csdn.net/xiaotao_css/article/details/72782416:通俗易懂的介绍(仅供18岁以上成年阅读)
看下面的东西之前,建议先看上面链接的这篇文章
对象: 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现在是儿子。
在 p1 和 p2 实例中,__proto__属性,指向的是 创造他们的构造函数Person 对象的 prototype 属性,所对应的对象。
也就是 Mother().
一个构造函数对象的原型,就相当于 他妈,这个构造函数对象的实例,就相当于 他妈不同的孩子。
而 每个 实例中的 __proto__属性,就指向 他们共同的 妈 !也就是 构造函数对象的 prototype属性。
当我们输入 p1.name 的时候,原型链的搜索机制是先在实例中搜索相应的值,找不到就通过它的__proto__指针,在原型中找,还找不到就再往上一级原型中搜索……一直到了原型链的终点( 就是js自带的Object,它的原型比较特殊,为null ),就是到null还没找到的话,就返回一个 undefined。
构造器constructor : 每一个对象中的constructor 属性返回创建此对象的函数对象的引用;例如:
functon Dog ( name, color ) {
this. name = name;
this. color = color;
}
var dog1 = new Dog( "小白" , "白色" );
dog1.constructor == Dog 构造函数本身
在默认情况下,所有的原型对象都会自动获得一个 constructor(构造函数)属性,这个属性(是一个指针)指向 prototype 属性所在的函数(Person)
上面这句话有点拗口,我们「翻译」一下:A 有一个默认的 constructor 属性,这个属性是一个指针,指向 Person。即:
Person.prototype.constructor == Person
实例的构造函数属性(constructor)指向构造函数 :person1.constructor == Person
person1 为什么有 constructor 属性?那是因为 person1 是 Person 的实例。
那 Person.prototype 为什么有 constructor 属性??同理, Person.prototype (你把它想象成 A) 也是Person 的实例。
也就是在 Person 创建的时候,创建了一个它的实例对象并赋值给它的 prototype,基本过程如下:
var A = new Person();
Person.prototype = A;
结论:原型对象(Person.prototype)是 构造函数(Person)的一个实例。
以下代码的图示
function Foo ( ) { } ;
var f1 = new Foo;
以下是 深入解答原型是怎么回事 的一篇文章
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
腾讯大学原生JS 视频 :https://ke.qq.com/course/231577
回答出以下问题,就知道 __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
三、js跨域问题怎么解决?
1、 JSONP跨域请求
要理解跨域,先要了解一下”同源策略“。所谓同源是指,协议、域名、端口都相同。所谓”同源策略“,简单的说,就是基于安全考虑,当前域不能访问其他域的东西。
http 和 https :协议不同
www.a.com 和www.b.com :域名不同
www.a.com : 8080 和www.a.com : 1000 : 端口不同
在同源策略下,在某个服务器下的页面是无法获取到该服务器以外的数据的。
例如我们在自己的网站通过 ajax 去 获取豆瓣上的图书接口:
https://api.douban.com/v2/book/search?q=javascript&count=1
我们通过以上 ajax 去访问,发现运行时会报错:
只要出现这个错误,就说明服务器接口不支持跨域
//No 'Access-Control-Allow-Origin' header is present on the requested resource
这是因为不同源,所以无法访问其他服务器的数据
但是 的 src ( 获取图片 ) , 的 href (获取css),