ES6课堂笔记


ES6学习

一:数据类型

1.值类型
数字:number
字符串:string
布尔:boolean
未定义:undefined
2.应用类型
数组 Array
对象 Object

二: 变量声明

加粗样式

1.let

	1.局部变量在一对{ }里面才有效
	2.不能重复声明
	3.不会变量提示

2.const

	1.声明的是常量
	2.声明必须赋值
	3.不能被修改
	4.建议变量名采用大写

在这里插入图片描述

三:解构-数组(重点)

01基础解构

let  arr = [1, 3, 5, 7, 9];
let [a, b, c] = arr;
console.log("a:",a);
console.log("b:",b);
console.log("c:",c);

02 交换变量

let a = 15;
let b = 27;
[b,a] = [a,b];
console.log("a:",a)
console.log("b:",b);

03 跳过

let  arr = [1, 3, 5, 7, 9];
 let [,a,,,b] = arr;
 console.log(a,b)

04 剩余

let  arr = [1, 3, 5, 7, 9];
let [a,...b] = arr;
console.log(a,b)

05 默认值 (是1)

let  arr = [1, 3, 7];
let [a,b,c=100] = arr;
console.log(a,b,c)

06 字符串

let [a,b,c,d] = "我爱我的祖国";
console.log(c)

07 实现浅拷贝(复制)

var arr = [1,3,5];
var arr1 = [...arr];
arr1[1]=100;
console.log(arr,arr1)

四:解构-对象(重点)

01基本
02对象解构没有顺序

var obj = {name:"木木",age:19,weight:128};
// let {weight,name} = obj;
// console.log(name,weight)

03剩余值

var obj = {name:"木木",age:19,weight:128};
let {weight,...rest} = obj;
 console.log(weight,rest)

04默认值

var obj = {name:"木木",age:19,weight:128};
let {name,eye=2} = obj;
console.log(name,eye) 

05 复制

var obj = {name:"木木",age:19,weight:128};
var obj2 = {...obj};
obj2.name = "zql";
console.log(obj2,obj)

在这里插入图片描述

五:字符串

1.ES5 新增方法
01trim()

 var str = '  我爱  我的祖国   ';
		console.log(str.trim()); //去掉全部空格
		console.log(str.trimLeft());//去掉左边空格
		console.log(str.trimRight());//去掉右边空格

02repeat() 重复

var str = '  我爱我的祖国';
 console.log(str.repeat(10));

02 ES6 新增方法

var str = '我爱js';
		for(let i of str){
			console.log(i);
		}

3.遍历 for of

补充:(index(查找字符串,从哪个下标开始返回下标或者-1))

01 includes 是否包含(返回ture/false)

var str = "我爱你就像老鼠爱大米";
alert(str.includes("恨"));

02 startsWith 开头

var str = "我爱你就像老鼠爱大米";
var ind = str.indexOf("狠") 找不到返回-1
alert(str.startsWith('我'))

03 endsWith 结尾

var str = "我爱你就像老鼠爱大米";
alert(str.endsWith("大米"))

!

六:字符串模板

var name = "捷爱士";
	var age  = 18;
	// var str = '大家好我的名字是"'+name+'"今年'+age+'岁了';
	var str = `大家好我的名字是"${name}",
	今年${age}岁了`;
	console.log(str);

在这里插入图片描述

高阶方法六个 头

七:forEach 遍历

有三个参数(形参,index(下标),self(自己))

var arr = ['我','爱','我的','祖国'];
		arr.forEach(function(itme,index,self){
			console.log(itme,index,self);
		})

八:map 映射

var arr = [1, 3, 5] //变成2,6,10
		var arr2 = arr.map(
			function(item,index,self) {
				console.log(item, index, self)
				return item * 2;
			}
		)
		console.log(arr2);

九:filter 过滤

//回调函数如果返回true, 当前 元素保留。如果返回为false, 当前元素被过滤掉。

var arr1 = [2,-50,30,25,19,60,5,7];
		//目标:过滤,大于20的数
		var arr2 = arr1.filter(
			function(item){
				return item>20;
			}
		)
		console.log('arr1:',arr1);
		console.log('arr2:',arr2);

十: reduce 累计

a,b两个参数 上一次计算结果是这一次的a

// reduce 累计 a,b两个参数 上一次计算结果是这一次的a
		 var arr = [2, 3, 4];
		 var ret = arr.reduce(
			function(a,b){
				return a+b;
			}
			// // 第一次 a:2  b:3  返回 5
		 	// // 第二次 a:5 b:4 返回  9
		 )
		alert(ret);

十一:every 每个

every 每个
		var arr = [2,4,6,7,100,20,50];
		// 目标判断 是否数组中的每个元素都小于10
		var ret = arr.every(
			function(item){
				return item<10;
			}
		)
		// 如果所有都小于10 最终返回true,有一个大于10 返回false
		 alert(ret);

十二:some 有一个

some 有一个
		var arr = [2, 4, 6, 7, 100, 20, 50];
		// 目标判断 是否数组中有大于20的数
		var ret = arr.some(
			function(item) {
				return item > 20
			}
		)
		alert(ret);

在这里插入图片描述

高阶方法六个 尾

十三:箭头函数(重点)

1.普通函数

	function times(n){
			alert(n*2)
		}
	times(6);

2.箭头函数

箭头函数函数简写方式
1.组成: 参数 => 语句,

//箭头函数函数简写方式
var times = n =>alert(n*2);
times(6);
	声明一个变量times 为一个函数
	函数参数为n,函数执行语句为aler(n*2)
	=> 前函数的参数
	=> 后是函数的执行语句也是 返回值
var arr = ['我爱','我','的','祖国'];
arr.forEach(item=>console.log(item));


2.参数不是1个: (参数1,参数2)=>语句,

var arr = [1,2,3,4];
//目标求和
var ret = arr.reduce((a,b)=>a+b);
alert(ret);
如果不是一个参数,参数用()包裹

3.语句不止一条: 参数 =>{语句1;语句2;return 返回值}

// 默认setInterval this指向window
//  箭头函数this的指向为上一层作用域中的this obj;
var obj = {
		age:18,
		say:function(){
			console.log("今年我"+this.age)
		},
		grow:function(){
			window.setInterval(()=>{
				this.age ++;
				this.say();
			},3000)
		}
	}

4.返回的对象格式: 参数=>{(对象)}

var arr = [1,2,3,4];
	// 把arr 映射为 [{num:1},{num:2}]
	var arr2 = arr.map(item=>({num:item}))
	console.log(arr2);

十四:函数

1.函数的默认参数

function add(a,b=10){
			alert(a+b)
		}
	//add(3,5);
	add(3)

2.函数的不定参数

function add(...args){
			var ret = args.reduce((a,b)=>a+b);
			alert(ret);
		}
		// add(1)
		add(2,8,1,7,3)

3.函数的拓展参数

function metting(a,b,c,d){
			console.log('今天开会的有:',a,b,c,d);
		}
		// metting("习嘻嘻","乔开心","江起洋","王振宇");
		var arr = ["苏晓明","敲开心","王振宇","小红","小米"]
		
		metting(...arr);

在这里插入图片描述

十五:数组新增方法

1.填充 fill(“填充内容”,start,end)

var arr = [1,3,5,7];
arr.fill("love",2);
console.log(arr);
//从数组拷贝替换元素copywithin(替换开始位置,拷贝开始位置,拷贝结束位置)
var arr = [0,1,2,3,4,5,6,7];
var arr1 = arr.copyWithin(0,4,6);
console.log(arr);
console.log(arr1);

2.查找
1.includes

	var arr = ["我","好","中意","你",100];
			alert(arr.includes("好"));

2.按条件查找 find查找元素 findIndex查找下标

var arr = [2,7,10,100,50,255];
		//查找arr中是否有大于100的数
			// var ret = arr.find(item=>item>100);
			// alert(ret);
		
			var ret = arr.findIndex(item=>item>100);
			alert(ret);

在这里插入图片描述

十六:对象

01 简写方式

var name = "num";
var age = 18;
		var user = {
			name,
			age,
			say(){
				alert(`大家好我的名字是${this.name},今年${this.age}`);
			}
		};
		
		
		console.log(user)

02 对象的动态属性

var str = window.prompt('请输入对象名称',"link");
var value = window.promt("请输入对象值","好好学习");
var obj = {[key+"web"]:value};

03 对象的继承

 var man={
	 leg:2,
	 walk(){console.log(`我用我的两条腿步行`)}
 }
 
 var teacher = {
	 name:"mumu",
	 age:18,
	 __proto__:man
 }

十七:call和apply

//apply 传递参,数数组的形式
// 案例求数组的最大值,最小值

// var arr = [15,20,-8,99];
		// var min = Math.min(...arr);
		// alert(min);
		
		var max = Math.max.apply(null,arr);
		alert(max);
		
		
		function say(a,b){
			//默认函数  中的this指向 window
			console.log(this)
			console.log(a+b)
		}
		say();

十八:bind

//bind 创建一个新的函数,并传入this

//bind 创建一个新的函数,并传入this
		var name = 'mumu';
		var age = 18;
		function say(){
			console.log(`大家好我的名字是${this.name},今年${this.age}岁了`)
		}
		
		// say();
		
		var nsay = say.bind({name:"从来",age:10},10);
		//say通过bind创建一个新的函数 , this为bind第一个参数,a的值是10
		nsay(7);

十九:set

//set 是一个不重复的数组

//作用:可以对数组进行去重
		// var s1= new Set([1,2,32,7,8,7]);
		// console.log(s1)
//数组去重方式
		// var arr = [1,2,32,7,8,7];
		// var s1 = new Set(arr);
		arr = [...s1];

		// arr = Array.from(s1);
		// console.log(arr);

// 初始化new Set();
// 添加 add();
// 删除 remove();
// 获取长度 size();
// 清空clear()
// 遍历 for of;
// 转换为数组 Array.form() […];

var s = new Set([1,3,1,3,5,7,9]);
		console.log(s);
		console.log("size",s.size);//数组长度
		console.log("是否有5",s.has(5));//返回值true/false
		//-------------------------
		s.add(12);//添加
		console.log(s);
		s.delete(1);//删除
		console.log(s);
		//for of 遍历元素
		for(let i of s){
			console.log(i);
		}

二十:Map

//map 类似于对象,
//键名可以是任意对象,对象:键名只能是 字符串或者 symbol符号
//map 是有序的,对象:默认排序

// 特点,有序/key可以是任意值
// new Map([[k,v],[]])
// 长度size
// 添加set(k,v)
// 设置get(k)
// remove()
// 遍历for of
// clear()
//has()检测是否有;

//map.size 获取长度
//map.get(1)获取元素
//map.set(3,“amazing”)添加
//map.delete(2)删除

var obj = {"b":100,"a":"嘻嘻嘻","2":"best","1":"good"}
		console.log(obj);
		
		var map = new Map([["b",100],["a","aaa"],[2,"best"],[1,"good"]])
		
		console.log(map);

二十一:Symbol

// Symbol 符号 唯一值
// 常用于左右对象的key

//var obj = {[s1]:"mumu"}
//Symbol.for("blue") == Symbol.for("blue") True
//Symbol("blue") == Symbol("blue") False

二十二:for of

// string 字符串 Number 数字 Boolean 布尔 undefined 未定义 Symbol 符号 function 函数 Object 对象 Array 数组 Set 集合 Map 键值对 weakMap weakSet weakMap 键必须是引用类型

// 可以迭代类型:通过for of 可以遍历的,
// string Array Set Map

var arr = ["我爱","我的","祖国"];
		// 默认遍历是value
		for(let item of arr){			
			console.log(item);
		}
		//keys 键名的集合
		for(let key of arr.keys()){
			console.log(key);
		}
		//value值的集合
		for(let val of arr.values()){
			console.log(val);
		}
		//entries键与值的结合
		for(let [key,val] of arr.entries()){
			console.log(key,val);
		}

二十三:class类

// 类:创造对象的一个模板
// 实例:是被类创建的对象,一个类可以创建多个实例
1.创建类

 //狗类: 名字,咬人,叫
		// class Dog{
		// 	constructor(name) {
		// 		this.name = name;
		// 		//this类的实例
		// 	}
		// 	//构造函数(new 类被调用)
		// 	bark(){
		// 		console.log("旺旺旺旺");
		// 	}
		// }
		// var d1 = new Dog("大黄");
		// var d2 = new Dog("旺财");
// //猫类: 名字,咬人,叫
		// class Cat {
		// 	constructor(name) {
		// 		this.name = name;
		// 		//this类的实例
		// 	}
		// 	//构造函数(new 类被调用)
		// 	bark(){
		// 		console.log("喵喵喵喵喵");
		// 	}
		// }
		// var c1 = new Cat("TOM");
		// var c2 = newCat("kity");

2.继承类:

// 动物:名字,跑
		class Animal{
			constructor(name) {
				this.name = name;
				//this类的实例
			}
			runing(){
				console.log("我会走的");
			}
		}
		
		class Dog extends Animal{
			constructor(name) {
				super(name);//调用父类的构造函数
				//this类的实例
			}
			//构造函数(new 类被调用)
			bark(){
				console.log("旺旺旺旺");
			}
		}
		
		class Cat extends Animal{
			constructor(name){
				supr(name);
			}
			bark(){
				console.log("喵喵喵喵喵");
			}
		}
		
		
		var c1 = new Cat("TOM");
		var c2 = new Cat("kity");
		var d1 = new Dog("大黄");
		var d2 = new Dog("旺财");

3.封装

//set get 当我们去设置或者获取时对数据进行额外的操作,影藏原本的数据直接操作。

// 动物:名字,跑
		class Animal{
			constructor(name) {
				this.name = name;
				//this类的实例
				
			}
			runing(){
				console.log("我会");
			}
		}
		class Cat extends Animal{
			constructor(name,age=2){
				super(name);
				this.age = age;
			}
			bark(){
				console.log("喵喵喵喵喵");
			} 
			set Age(val){
				if(val>0){
					this.age = val;
				}else{
					console.log("设置年龄不正常")
				}
			}
			get Age(){
				console.log("被GET到了");
				return this.age;
			}
		}
		
		
		var c1 = new Cat("TOM");
		var c2 = new Cat("kity",5);

4.静态属性

class Animal {
			constructor(name) {
				this.name = name;
			}
			runing() {
				console.log("我会走会跑,主人你在哪里");
			}
		}
		class Cat extends Animal {
			constructor(name, age = 2) {
				super(name);
				this.age = age;
				// 每次构造函数被调用 num 加1 记录有多少个实例
				Cat.num ++;
				Cat.sayLog();
			}
			static num = 0;
			//  静态属性 值 0
			static sayLog(){
				console.log(`当前总共有${Cat.num}个只猫`)
			}
			
			
			bark() {
				console.log("喵喵喵喵喵");
			}
			set Age(val) {
				if (val > 0) {
					this.age = val;
				} else {
					console.log("设置年龄不正常")
				}
			}
			get Age() {
				console.log("被GET到了");
				return this.age;
			}
		}


		var c1 = new Cat("TOM");
		var c2 = new Cat("kity", 5);
		

		//set get 当我们去设置或者获取时对数据进行额外的操作,影藏原本的数据直接操作。

二十四:模块

// 导入的三种方式
// 1.import {name} from ‘./components/be.js’;
// //一个一个导出
// 2.import Cat,{func,name} from ‘./components/be.js’;//Cat直接导出
// 3.import *as obj from ‘./components/be.js’;
// //导出所有

引入的js名be.js

var name = "mumu";
function func (){
	console.log("大家好"+name);
}
class Cat{
	constructor(name) {
	    this.name = name;
	}
}
//导出
export {func,name};

//默认导出
export default Cat;
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
	</body>
	<script type="module">//要注意type = "module"
		// 第一种方法
		// import {name} from './components/be.js';
		// alert(name);
		// import {func} from './components/be.js';
		// func();
		//第二种方法
		// import Cat,{func,name} from './components/be.js';
		
		// func();
		// var c1 = new Cat("kitty");//需要一下初始化classl类,才能调用
		// console.log(c1);//调用
		// console.log(name);
		
		
		// 导入的三种方式
		// 1.import {name} from './components/be.js';
		// //一个一个导出
		// 2.import Cat,{func,name} from './components/be.js';//Cat直接导出
		// 3.import *as obj from './components/be.js';
		// //导出所有
	</script>
</html>

二十五:生成器

1.迭代生成器

//js 可以迭代类型string Array Set Map
		function *gen(){
			yield "我";//遇到yield时停止
					   //隐藏的done为false 时没有完成,需要继续下一步
			yield "好";
			
			yield "中意";
			
			yield "你";
			
						//没遇到yield时,完成
						//隐藏的done为true 时完成,不需要继续下一步
		}
		//接收一下函数
		var iter = gen();
		
		// 生成器函数generator 遇到yield 停止执行
		// 通过 next 去调用的是 移动到下一个yield停止
		// 返回的值 为yield {value:yield的结果,done:false}
		
		//for of循遍历iter出gen()的value:yield的结果; 
		for(let item of iter){
			console.log(item);
		}
		

2.//迭代对象

var obj = {
			name: "mumu",
			age: 18,
			weight: 130
		};
		//创建一个生成器函数
		function *gen(obj) {
			// 获取对象的所有key(键)的列表
			var keys = Object.keys(obj);
			
			// 遍历所有的键 执行yield 返回 一个数组[键,值]
			for (var i = 0; i < keys.length; i++) {
				yield [keys[i], obj[keys[i]]];
			}
		}
		
		var iter = gen(obj);
		// 遍历可迭代对象
		// 取出k键,v值
		// for (let [k, v] of iter) {
		// 	console.log(k, v);
		// }
		// 当h1被单击
		myh.onclick = function(){
			// 获取迭代next 结果
			var obj = iter.next();
			
			if(!obj.done){
				myh.innerText = obj.value;//设置返回的值
			}else{
				myh.innerText = "请充值"; //如果已经完毕 
			}
			
		}

二十六:promise承诺(重点)

		// 承诺 Promise
		// 结果:resolve 兑现   reject 拒绝
		// 凭据:then 然后 , catch 捕获捕获
		
		
		// 目标:小王同学给自己的女朋友承诺 等30岁后给它买个别墅,前面有花园,后面有游泳池,顶楼是停机坪,底层是车库。
		var p = new Promise(function(resolve,reject){//小王承诺做出(兑现/拒绝)
			setTimeout(()=>{
				var n = Math.random();//创建一个0-1随机数
				if(n>0.5){//如果大于0.5兑现
					resolve("买个别墅,前面有花园,后面有游泳池,顶楼是停机坪,底层是车库。")
				}else{
					reject("要不等40岁的时候");
				}
				
				
			},2000)//答应的时间期限
		})
		
		
		p.then(function(res){//res 是resolve的形参
			console.log(res)  //调用得到了兑现
		})//如果兑现调用这个函数
		
		.catch(err=>{//err 是reject的形参
			console.log(err)//被拒绝
		})//如果被拒绝调用这个函数
		

二十七:回调函数

01

function say(str,time,callback){
			setTimeout(()=>{
				console.log(str);
				if(callback){callback()}//判断是否传入函数参数,有就调用。
			},time)
		}
		say("你好能加你一个微信吗?",3000,function(){
			say("我非常喜欢你",5000,function(){
				say("邀请你一起去玩",2000);
			})
		})
		
		//回调函数  实现延期任务  层级多深(回掉地狱)
		

02

function say(str,time){
			return new Promise((resolve,reject)=>{
				setTimeout(()=>{
					console.log(str);
					resolve(str);
				},time)
			})
		}
		say("你好能加你一个微信吗?",3000)
		.then(res=>{
			return say("我非常喜欢你",5000)
		})
		.then(res=>{
			return say("邀请你一起去玩",2000)
		})
		
		.then(res=>{
			
		})
		//返回的是上一个结果
		

二十八:案例

01weather获取地址,温度,天气,图片

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="./jquery-3.3.1.js"></script>
	</head>
	<body>
		<p>
			<span class="add"></span> 
			<span class="weather"></span>
			<span class="temp"></span>
			<img src="" class="img" alt="" width="30">
		</p>
<script>
	
	$(function(){
		
		// 获取网络请求 信息(根据不同的url返回不同的结果)
		function getApi(url){
			// 返回一个承诺
			return new Promise((resolve,reject)=>{
				$.ajax({
					url:url,
					dataType:"jsonp",
					success:function(res){
						resolve(res); //如果请求成功就可以兑现(兑现的数据是请求回来的数据)
					},
					error:function(err){
						reject(err) //如果失败 拒绝兑现 给出拒绝理由
					}
				})
			})
		}
		
		// 获取地址
		var urlA = "https://apis.map.qq.com/ws/location/v1/ip?key=CAABZ-AVSAQ-RDR5L-GTBDJ-HLA4O-A5FDB&output=jsonp&_=1593478015329";
		var urlB = "https://wis.qq.com/weather/common?weather_type=observe|forecast_24h|air&source=pc";
		// 添加&province=省份&city=城市
		
		getApi(urlA)
		.then(add=>{// 获取地址
			console.log(add);
			var info = add.result.ad_info;//具体的地址信息
			$(".add").text(info.city);
			return getApi(urlB+`&province=${info.province}&city=${info.city}`)
		})
		.then(data=>{// 获取天气
			console.log(data);
			$(".weather").text(data.data.observe.weather)
			$(".temp").text(data.data.observe.degree)
			$(".img").attr("src",`https://mat1.gtimg.com/pingjs/ext2020/qqindex2018/dist/img/weather/${data.data.observe.weather_code}.svg`)
		})
		.catch(err=>{// 失败
			console.error(err);
		})
		
	 
		
	})
</script>
	</body>
</html>

02按序加载图片,只显示一张

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		 
	</head>
	<body>
	
			
<script>
	var arr = [
		"https://cdn.cnbj1.fds.api.mi-img.com/mi-mall/c0c05274f2fbb55fbccb89622f798907.jpg?w=632&h=340",
		"https://cdn.cnbj1.fds.api.mi-img.com/mi-mall/b746a4db2e0473cc076a3a4b9bbe0235.jpg?w=632&h=340",
		"https://cdn.cnbj1.fds.api.mi-img.com/mi-mall/816a66edef10673b4768128b41804cae.jpg?w=632&h=340"
	]
	// 同时加载这三张图片,哪张图片加载,只显示哪张 race 比赛
	function loadImg(url){
		// 返回一个promise 实例
		return new Promise((resolve,reject)=>{
			var img = document.createElement("img");
			// 创建一个图片节点
			img.src = url;// 设置src
			img.width = 200; //设置宽度
			img.onload = function(){
				// 图片加载完毕
				resolve(img); //返回图片
			}
			img.onerror=function(e){
				reject(e) //失败 e失败事件对象
			}
		})
	}
	// Promise.race 比赛 哪个promise最先 reslove 返回哪个
	Promise.race([
		loadImg(arr[0]),
		loadImg(arr[1]),
		loadImg(arr[2])		
	])
	.then(res=>{
		document.body.append(res)
		// 插入到body标签里面
	})
	.catch(err=>console.error(err))
	// 如果失败打印失败的元素


</script>
	</body>
</html>

二十九:async

function say(msg,time){
			return new Promise((resolve,reject)=>{
				setTimeout(()=>{
					console.log(msg);
					resolve(msg);
				},time)
			})
		}
		// say("我们去玩吧",3000)
		// .then(res=>{
		// 	return say("我想想",2000)
		// })
		// .then(res=>{
		// 	return say("ok",2000)
		// })
		
		async function doit(){
			await say("我们去玩吧",2000)
			await say("我想想",2000)
			await say("ok",2000)
		}
		
		doit();

三十:代理 proxy

//代理目标 target
//带理操作 handler

var target = {name:"mumu",age:18};
		//代理处理函数  set 设置处理函数,get 获取处理函数
		var handler = {			
			set(target,key,value){
				console.log(key,"我被设置了")
				if(value<=0){
					console.warn("年龄非法")
				}else{
					target[key] = value;
				}
				
			},
			get(target,key){
				console.log(key,"我被获取了")
			}
		}
		
		//设置一个新的代理对象
		//代理可以让设置,获取的对象属性是进行一些控制操作
		var proxy = new Proxy(target,handler);

三十一:反射

var obj = {name:"name",age:10,leg:2}
		//反射 ES6 新出的特性
		//若需要在Proxy内部调用对象的默认行为,反射
		var name = Reflect.get(obj,"name")
		console.log(name);
		
		//设置obj的age值为30
		Reflect.set(obj,"age",30);
		
		//检查对象是否有某个属性
		var flag = Reflect.has(obj,"leg");
		console.log(flag);

		//获取对象的所有键名
		var keys = Reflect.ownKeys(obj);
		console.log(keys);

三十二:Object.defineProperty()

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
	</body>
	<script>
		//Object.defineProperty(obj,prop,descriptor);
		// obj:必须。目标对象
		// prop:必需。需定义或修改的属性的名字
		// descriptor:必需。目标属性所拥有的特性
		
		// 01 value属性,设置属性值的。
		
		
		// var user = {};
		// Object.defineProperty(user,"name",{
		//  value:"狂奔的蜗牛"
		// })
		// console.log(user);//{name: "狂奔的蜗牛"}
		
		// Object.defineProperty(user,"isSlow",{
		// 	value:true
		// })
		
		// Object.defineProperty(user,"sayHi",{
		// 	value:function(){
		// 		console.log("HI!")
		// 	}
		// })//传入方法属性
		
		// Object.defineProperty(user,"birth",{
		//  value:{
		//   date:"2018-06-29",
		//   hour:"15:30"
		//  }
		// })	//传入对象属性
		
		// console.log(user)
		
		
		
		
		// 02 writable属性,属性是否可以被重新赋值。
		//接受数据类型为 boolean(默认为false) true ,支持被重新赋值 false,只读。
		
		// var user = {};
		// Object.defineProperty(user,"name",{
		// 	value:"王者",
		// 	writable:true
		// })
		// console.log(user);
		
		// user.name="荣耀王者"
		// console.log(user);
		
		
		
		
		
		
		
		// 03 enumerable属性是否可以被枚举
		//受数据类型为 boolean(默认为false) true,支持被枚举 false,不支持
		
		
		// var user ={
		//  name:"狂奔的蜗牛",
		//  age:25
		// } ;
		// var keys = Object.keys(user);
		// console.log(keys);//['name','age']
		
		
		// var user ={
		//  name:"狂奔的蜗牛",
		//  age:25
		// } ;
		
		// //定义一个性别 可以被枚举
		// Object.defineProperty(user,"gender",{
		// 	value:"男",
		// 	enumerable:true
		// })
		// //定义一个出生日期 不可以被枚举
		// Object.defineProperty(user,"birth",{
		//  value:"1956-05-03",
		//  enumerable:false
		// })	//不显示的意思
		
		// var keys = Object.keys(user);
		// console.log(keys);
		
		
		
		
		
		
		// 04 configurable属性 
		// 两个作用:1 属性是否可以被删除
		
		// 2 属性的特性在第一次设置之后可否被重新定义特性
		// var user ={
		//  name:"狂奔的蜗牛",
		//  age:25
		// } ;
		
		
		// //定义一个性别 不可以被删除和重新定义特性
		// // 设置为 false
		// Object.defineProperty(user,"gender",{
		// 	value:"男",//设置属性
		// 	writable:true,//可以重新赋值
		// 	enumerable:true,//可以到看设置的这个属性
		// 	configurable:false//不可以被删除和重新定义特性
		// })
		
		
		
		
		// // //删除一下
		// var user ={
		//  name:"狂奔的蜗牛",
		//  age:25
		// } ;
		// //定义一个性别 可以被删除和重新定义特性
		// Object.defineProperty(user,"gender",{
		//  value:"男",
		//  enumerable:true,
		//  configurable:true
		// })
		
		// //删除前
		// console.log(user);
		// // {name: "狂奔的蜗牛", age: 25, gender: "男"}
		// //删除一下
		// delete user.gender;
		// console.log(user);
		// // {name: "狂奔的蜗牛", age: 25}
		 
		// //重新定义特性
		// Object.defineProperty(user,"gender",{
		//  value:"男",
		//  enumerable:true,
		//  configurable:false
		// })
		// //删除前
		// console.log(user);
		// //删除一下 删除失败
		// delete user.gender;
		// console.log(user);
		// {name: "狂奔的蜗牛", age: 25, gender: "男"}
		
		 // configurable设置为 true 则该属性可以被删除和重新定义特性;反之属性是不可以被删除和重新定义特性的,默认值为false(除了可以给新定义的属性设置特性,也可以给已有的属性设置特性)
		
		
		
		
	// 05 set和get重要的两个属性
	
		// get属性
		// var user ={
		//  name:"狂奔的蜗牛"
		// } ;
		// var count = 12;
		// //定义一个age 获取值时返回定义好的变量count
		// Object.defineProperty(user,"age",{
		// 	get:function(){
		// 		return count;
		// 	}
		// })
		// console.log(user.age);//12
		
		//如果我每次获取的时候返回count+1呢
		// var user ={
		//  name:"狂奔的蜗牛"
		// } ;
		// var count = 12;
		// Object.defineProperty(user,"age",{
		// 	get:function(){
		// 		return count+1;
		// 	}
		// })
		// console.log(user.age);//13
		
		
		// set属性
		
		// var user ={
		//  name:"狂奔的蜗牛"
		// } ;
		// var count = 12;
		// //定义一个age 获取值时返回定义好的变量count
		// Object.defineProperty(user,"age",{
		// 	get:function(){
		// 	  return count;
		// 	 },
		// 	 set:function(newVal){
		// 		 count = newVal;
		// 	 }
		// })
		// console.log(user.age);//12
		// user.age=145;
		// console.log(user.age);//145
		// console.log(count);//145
		
		
//等等,如果我想设置的时候是 自动加1呢?我设置145 实际上设置是146
		
		// var user ={
		//  name:"狂奔的蜗牛"
		// } ;
		// var count = 12;
		// //定义一个age 获取值时返回定义好的变量count
		
		// Object.defineProperty(user,"age",{
		// 	 get:function(){
		// 	  return count;
		// 	 },
		// 	 set:function(newVal){
		// 	   count=newVal+1;
		// 	  }
		// })
		// console.log(user.age);//12
		// user.age=145;
		// console.log(user.age);//146
		// console.log(count);//146
		 //注意:当使用了getter或setter方法,不允许使用writable和value这两个属性(如果使用,会直接报错)
		// get 是获取值的时候的方法,类型为 function ,获取值的时候会被调用,不设置时为 undefined
		// set 是设置值的时候的方法,类型为 function ,设置值的时候会被调用,undefined
		// get或set不是必须成对出现,任写其一就可以
		
		var user ={
		 name:"狂奔的蜗牛"
		} ;
		var count = 12;
		//定义一个age 获取值时返回定义好的变量count
		Object.defineProperty(user,"age",{
			get:function(){
				console.log("我要来获取值了!!");
				return count;
			},
			set:function(newVal){
				console.log("我要来设置值了!!");
				count=newVal+1;
			}
		})
		
		console.log(user.age);//12
		user.age=145;
		console.log(user.age);//146
		
		// 总结:  Object.defineProperty方法直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象
		// 1 value: 设置属性的值,
		// 2 writable: 值是否可以重写。true | false,
		// 3 enumerable: 目标属性是否可以被枚举。true | false,
		// 4 configurable: 目标属性是否可以被删除或是否可以再次修改特性 true | false,
		// 5 set: 目标属性设置值的方法,
		// 6 get:目标属性获取值的方法   
		
		
		
		
	</script>
</html>

程序实例使用的是读者朋友们比较关注的三层架构所编写,应用的开发环境是VS2008自带的AJAX无刷新环境,并且对于网站安全通过无解密MD5单向加密技术来实现。 读者朋友们在运行本实例时可以先以超级管理员的身份(用户名:mr 密码:mrsoft)来登录,然后可以设置考生ID号和教师ID号,之后便可以以考生或教师身份来登录,这里管理员有权限设置功能。 三层架构小知识: 下面对这几层进行介绍。 1、表示层,它负责响应用户的请求,对于这一层一般代码量很少。大量的处理工作交给其他的层完成。 2、业务逻辑层,用来对数据进行有效性验证,牵涉到对敏感数据的操作都需要经过业务逻辑层做判断,然后才能决定操作是否合法。 3、数据层,封装对数据库的操作。可以做一个通用的数据访问层,以后开发项目时,可以直接拿过来用,并且可以提高工作效率。另外,进行参数传值时,数据都用自定义实体类代替,这样可以实现数据访问层对其它层的完全透明。自定义实体类封装了所有与数据库表结构相关的代码。 4、Common层,用来封装一些常用的功能性代码,主要用来为其它层服务的。还有存放一些自定义实体类型和自定义实体类型集合。用于各层次之间数据交互的承载体。 说明:本书为了适合不同用户群的使用并不是所有程序实例都采用三层架构来设计,网站开发的三层架构并不适合于所有网站开发,应根据实际项目开发情况而定,如果读者朋友们喜欢三层架构模式可以根据本实例的编写将本书中其他未用三层架构的实例也改成三层架构模式。
评论 63
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值