第四周博客

62 阅读5分钟

保护对象

每个属性都有四大特性:

{
  value:'',
  writable:true,
  enumerableL:true,
  configurable,true
}

修改四大特性: 1.

   Object.defineProperty(对象名,"属性名",{
   四大特性:
   })
  2.Object.defineProperties(对象名,{
  "属性名":{四大特性},
  ...
  )

2.三个级别:

  1.防扩展:防添加
  Object.preventExtensions(obj);
  2.密封:防添加防删除
  Object.seal(obj);
  3.冻结:防添加防删除防修改
  Object.freeze(obj);

3.set拦截操作:

Object.defineProperty(lhl,"name"),{
  get:()=>{
   console.log("");
          },
   set:v=>{
   console.log(""+v);
   h1.innerHTML=v
          },
   })

对象的深浅拷贝 1.浅拷贝:按值传递

  var obj1={"name":"obj1"};
  var obj2=obj1;

2.浅拷贝:两者互不影响

  var obj1={"name":"obj1"};
  var obj2={...obj1}

3.以后如何拖点后端传来的数据的衣服:

var JSONtxt=JSON.stringify(obj);//后端穿衣服
var jsonObj=JSON.parse(JSONtxt);//前端穿衣服

3.Error对象 1.浏览器自带四种错误

1.语法错误:SyntaxError

2.引用错误:ReferenceError

3.类型错误:TypeError

4.方位错误:RangeError //只会在num.toFixed(d)0-100之间碰到

错误处理:

try{
   只放入你可能出错的代码
 }catch(err){
   发生错误后才会执行的代码
 }

try...catch的性能非常的差,正式发开常用分支技术代替。

4.抛出自定义错误:只要是错误,后续代码都不会执行

throw new Error("自定义错误消息")

5.严格模式

开启:"use strict"

作用: 1.可以禁止全局污染,使用变量必须先创建

2.将静默失败升级为报错

4、柯里化函数:

 function add(a){
   return function(b){
      return function(c){
         console.log(a+b+c)
     }
   }
}

     add(3)(5)(7);

第二天

匿名函数 1.自调:

  (function(){
     })();

2.回调

 elem.on事件名=function(){}
 arr.sort(function(){})
 xxx.api(function(){})
 var obj={
    "方法名":function(){}
 }

设计模式 1.单例模式

var h52302=(function(){
				let state=null;//state=dll
				return function(name,age){
					this.name=name;//dll.name="邓灵力"
					this.age=age;//dll.age=18
					if(state){//dll->{} -> true
						return state;
					}
					return state=this;
				}
			})();
			
			h52302.prototype.sayHello=function(){
				console.log(this.name);
			}
			
			var dll=new h52302("邓灵力",18);
			var wr=new h52302("王锐",19);
			
			console.log(dll);
			dll.sayHello();
			
			console.log(wr);//其实还是return了dll
			wr.sayHello();

2.观察者模式 let obj={};

		//创建订阅者
		function on(id,fn){
			if(!obj[id]){//判断有没有此id(有没有这个人),没有我就创建了一个空数组
				obj[id]=[];//obj["袍哥"]=[]
			}
			obj[id].push(fn);//obj["袍哥"]=[(msg)=>{console.log("小胡来了",msg)},(msg)=>{console.log("小罗来了",msg)},(msg)=>{console.log("小向来了",msg)}]
		}
		
		on("袍哥",(msg)=>{console.log("小胡来了",msg)})
		on("袍哥",(msg)=>{console.log("小罗来了",msg)})
		on("袍哥",(msg)=>{console.log("小向来了",msg)})
		on("袍哥",(msg)=>{console.log("小张来了",msg)})
		on("袍哥",(msg)=>{console.log("小王来了",msg)})
		on("袍哥",(msg)=>{console.log("小李来了",msg)})
		
		//发布者的操作
		function emit(id,msg){//id="袍哥"
			obj[id].forEach(fn=>fn(msg));//obj["袍哥"].forEach(fn=>fn("一支穿云箭"))
		}
		
		btn.onclick=()=>{
			emit("袍哥","一支穿云箭");
		}

3.事件轮询 宏任务:不会卡住单线程应用,可以让后续代码先走,但是多个宏任务同时存在并不知道执行顺序。

1.定时器:setInterval和setTimeout() 2.AJAX

微任务:ES6提供了Promise对象

function ajax1(resolve){
   setTimeout()=>{
     console.log(1);
     resolve();//放行函数
   },Math.random()*5000)
}
function ajax2(){
				return new Promise(resolve=>{
					setTimeout(()=>{
						console.log(2);
						resolve();
					},Math.random()*5000)
				})
			}
			function ajax3(){
				return new Promise(resolve=>{
					setTimeout(()=>{
						console.log(3);
						resolve();
					},Math.random()*5000)
				})
			}
			new Promise(ajax1).then(ajax2).then(ajax3);
			console.log("后续代码");

第三天

1.交互模式

打开cmd输入,node回车,你就可以开始敲js代码

2.脚本/文件模式

1.先创建xx.js里面书写自己的代码

2.打开cmd输入:node文件的绝对路径

模块

exports.属性名=值;//公开
module.exports.属性名=值;
module.exports={
    属性名:属性值,
    ...
}
exports={}错误导出法

在主模块引入require(是一个方法)。

    var x=require("./路径")

面试鄙视题:

exports和module.exports有什么区别?

exports={},写法是错误的

其实Node.js底层有一句话:exports={}

其实真正做公开功能的是module.exports

如果你使用了exports={};//

你创建了一个新的空对象,把module.exports覆盖了,所以不再具有公开的功能

模块分为:

1.官方模块

2.第三方模块

3.自定义模块

1.Global模块

五个预定义变量 1.filename当前文件的完整绝对路径

2.dirname不包含自己的名字

3.exports公开

4.require导入其他模块

5.module包含以上4个操作

2.querystring模块:解析查询字符串

var qs=require('querystring');//解析查询字符串部分
var obj=qs.parse("查询字符串");

url模块

var url=require("url");//解析url各个部分的功能
var objUrl=url.parse("url",true)//true会自动使用querystring的parse方法去解析字符串

查询字符串:

objUrl.query.键名;
objUrl.path //路由

fs模块


var fs=require("fs");
fs.readFile(文件路径,(err,buf)=>{
       console.log(buf);//异步读取文件
})
fs.writeFile(文件路径,"新内容"/buf,(err)=>{
     console.log();//异步写
})
fs.appendFile(文件路径,"新内容"/buf,(err)=>{
     console.log();//异步追加
})

第四天

http模块:搭建服务器&文件系统

    var http=require("http");
    var url=require("url");
    var fs=require("fs");
    var app=http.createSever();//创建服务器应用
    app.listen(80)//绑定端口号;
    app.on("request",(req,res)=>{绑定请求事件,只要有人请求,就会触发,有一个属性叫做req.url获取前端传到后端的路由和请求消息
    var objUrl=url.parse(req.url,true);
    var router=objUrl.pathname;//保存路由
    if(router=="/"||router=="index.html")//判断路由引入fs文件模块
   //res:response有个方法叫做res.end("响应的内容"/buf);
   fs.readFile(__dirname+"/public/html/index.html",(err,buf)=>{
   res.end(buf)  
   })
 }else if(router.match(/html)!=null){
   fs.readFile(__dirname+`public/html${router}`,(err,buf)=>{
   res.end(buf)
   })
 }else if(router.match(/css|js/jpg/png/gif/wof/woff2/ttf2)!=null){
 fs.readFile(__dirname+`public${router}`,(err,buf)=>{
  res.end(buf)
   })
 }

强调:一切的src和href都是一个请求都是一个路由,这个请求需要后端来解析。

第五天


1、安装第三方模块:mongoose
		
	2、使用步骤:
		1、引入:var mongoose=require("mongoose");
		2、连接数据库:mongoose.connect("mongodb://127.0.0.1/h52302");
		3、创建出一个新的数据表的同时,设置数据类型的控制,防止用户乱输
			var UserSchema=mongoose.Schema({
				name:String,
				pwd:String,
				age:Number,
				email:String,
				vip:String
			})
			//		模型名随意的        数据的控制         表名,没有则为创建,有了则为选中!
			var User=mongoose.model("User",UserSchema,"user")


		4、增:21、创建要插入的对象
			var x=new User({
				name:"袍哥1",
				pwd:"123456",
				age:"123",
				email:"pg@qq.com",
				vip:"1"
			})
			2、创建好的对象插入到数据表中
			x.save().then(()=>{
				console.log("插入完毕了,你要干什么,必须放在这个里面,因为他也是异步")
			})

		5、删:
			User.deleteOne/deleteMany({条件}).then(()=>{
				console.log("删除完毕了,你要干什么,必须放在这个里面,因为他也是异步")
			})

		6、改:
			User.updateOne/updateMany({条件}).then(()=>{
				console.log("修改完毕了,你要干什么,必须放在这个里面,因为他也是异步")
			})

		7、查:
			User.find({条件}).then((rs)=>{
				rs->查询到的数据
			})