回调地域:
与后台发生数据交互的时候,ajax的请求回调中还有一个或者是多个ajax请求,这样的现象就形成了回调地域。
缺点:代码复杂,所有的请求一环套一环。逻辑不清晰,不方便阅读同时也不利于调试。(ajax破坏了json的调试机制)
解决办法:promise
1.promise(保证,承诺,允诺)
作用:(1)答应某件事情,承诺去做某件事情
(2)用于解决回调地域的现象。回调地域一般出现在ajax请求当中
三种状态:
(1).承诺的事情在进行中
(2).承诺的事情没有完成
(3).承诺的事情已经完成了
谁去允诺?做什么事情?完成的情况?
对象———执行代码---返回结果
允诺步骤:
(1)创建一个允诺对象 两个参数(成功,失败)
var pro= new promise(function(success,failed){
//执行承诺的事情的过程有三种状态
//(1).承诺的事情在进行中(pending)
//(2).承诺的事情没有完成 (rejected)
//(3).承诺的事情已经完成了(resolved)
});
pro下有一个“.then”方法,.then方法还可以接收一个回调
pro.then(function(res){
//接收成功回调传递回来的结果,结果保存在res中
},function(err){
//接收失败的信息,这样的表达不会报错。
}).then(function(res/err){
});
回调函数内可以无限写的then方法,每一次返回的结果就是上一个then方法执行出来的结果
“.catch”方法。接收失败回调传递回来的结果,保存在 err
pro.catch(function(err){
//catch方法接收失败回调传回来的结果,保存在err
});
2.对象(面向对象开发)
(1)对象和类
对象:当我们要使用一些方法时,这些方法都是存在某个对象下,有了对象才能使用方法
对象从何而来?
通过new一个构造函数,得到一个对象。
什么是构造函数?
构造函数就是传说中的类,我们只能按照类的方法去理解.(js中没有明确的面向对象的说法)
类和对象的关系:先有类才有具体的对象。
例:
要创建很多同一类型的对象,会写很多重复的代码
要解决这个代码重复的问题
就要应用到面向对象的方式来处理
(2)面向对象(面向对象是一种高级的编程开发思想)
面向对象就离不开this指向问题
this回顾
a.this指向离不开事件调用,函数创建的时候就产生一个this指向
b.(谁调用就指向谁)当有时间绑定,并执行了事件处理程序时,谁绑定的事件,事件处理程序中的this就指向谁
c.回调函数中的this指向window
d.匿名函数可以使用bind( )改变this的指向
call( )和apply( )可以改变函数中的this指向
e.箭头函数本身没有this,它的this是继承父级而来
f.箭头函数不能使用call( ),apply( ),bind( ),方法来改变this指向
g.严格模式下,全局函数的this是undefined
h.面向对象下的一些this
对象通俗的解释就是: 万事万物皆为对象
面向对象就是创造一出一个类,给到具体对象使用
开发思想说明:
把一个功能或者共有的属性,进行封装,形参一中了类型,通过这种类型可以创建无数个具体的对象,
这些对象就可以使用这种类型的属性和方法。
使用工厂模式来封装一种类型。
a.工厂模式封装:
function Person(name,age,sex){
//属性
var obj = new Object();
obj.name = name;
obj.age = age;
obj.sex = sex;
//方法
obj.eat = function(){
return this.name + "在吃饭";
}
return obj;
}
优点:
解决了创建多个同类对象代码重复问题
缺点:
这个对象所属类型不明确
写法不规范
什么是构造函数?
简单来说能产生对象的一个函数就是构造函数,构造函数本身也是一个函数
b.构造函数方式
构造的函数首写字母一般大写,这个是约定俗称的用于跟普通函数区分
构造函数的语法:
function Person(name, age,sex){//构造函数的实例类型
//属性
this.name=name; //实例属性
this.age=age; //实例属性
this.sex=sex; //实例属性
//方法
this.eat=function( ){ //实例方法
return this.name+”在吃饭”;
}
this.say=function(){ //实例方法
return this.name+”说:今年我”+this.age+”岁了”;
}
}
//对象
var zs=new Person( “张三”,20,“男”);//实例对象
var lisi=new Person(“李四”,18,“女”) ;//实例对象
实例属性:
在构造函数内部定义的属性交实例属性
实例方法:
在构造函数内部定义的方法叫实例方法
优点:
解决了创建多个同类对象代码重复问题
解决了对象所属不明确的类型
代码规范
缺点:
实例方法在内存空间占据的空间会很多,每new实例对象就会在内存中开辟一个函数的空间
来存放一个函数,这样的函数一般都是给所有的实例对象使用。这些方法都是公共的所以这里浪费了内存资源。
c.构造函数的原型
原型(prototype)是一个对象保存,同时在另外一个空间里面也叫原型空间
.prototype
是构造函数下的原型对象。(是以属性的情况存在)
可以在原型下面创建属性跟方法
例如:
Person.prototype.phone=“122312312312312”;//原型属性
Person.prototype.eat=function( ){return this.eat( );}//原型方法
(原型只能直接被修改)
原型下的属性和方法被所有的实例对象共享,一个改了,大家都改了。
d.完整的面向对象方式(混合对象方式)
私有(实例对象)的属性写在实例属性里面。
共有(实例方法)的方法写在原型下面。