第三周笔记

117 阅读5分钟

1、Object:

1、继承:父对象的属性和方法,子对象也可以使用
2、找父对象,又叫原型对象:
	1、子对象.__proto__;   前提必须有一个对象;
	2、构造函数名.prototype; 
3、两连一包:
	作用域链:从局部到全局查找变量的过程形成的路线
	闭包:保护一个需要反复使用的局部变量
	原型链:使用对象属性:__proto__,来一层一层找每个父元素,形成的一条链式结构
4、有了原型对象可以设置共有属性和共有方法:
	原型对象.属性名=属性值
	原型对象.方法名=function(){}
5、修改或者删除自有共有:
	自有:
		修改: obj.属性名=新值;
		删除:delete obj.属性名;
	共有:
		修改:obj.__proto__.属性名=新值;
		删除:delete boj.__proto__.属性名;
	     注:共有删除或修改时一定要加上__proto__,不然修改会操作到本地,删除会没有效果

2、ES5:

保护对象:
	三个级别:1、防扩展:禁止给对象添加新属性
			  Object.preventExtensions(obj);
		2、密封:禁止给对象添加新属性和删除属性
			  Object.seal(obj);
		3、冻结:禁止给对象添加、删除、修改属性
			  Object.freeze(obj);

3、数组的新API:

1、判断:结果是一个布尔值
	every: 要求每一个元素都要满足结果才为true,只要有一个不满足就为false
		var r=数组名.every(function(val,i,arr){
			return 判断条件;
		 })
	some:要求每一个元素都不满足结果才为false,只要有一个满足就为true
		var r=数组名.some(function(val,i,arr){
			return 判断条件;
		})
			val:当前值
			i:当前下标
			arr:数组本省
2、遍历:将数组中的每个元素取出来执行相同或相似的操作:
	forEach:遍历数组,直接修改原数组
		数组名.forEach(function(val,i,arr){
				操作;
			})
	map遍历数组,不修改原数组并且返回一个新数组
		var 变量名=数组名.map(function(val,i,arr){
				return 操作结果;
			})
3、过滤和汇总:
	过滤:选出自己想要的,不会修改原数组
		var 变量名=arr.filter(function(val,i,arr){
			return 判断条件;
		})
	汇总:把数组里的每个元素汇总到一起
		var 汇总值=数组名.reduce(function(prev,val,i,arr){
			return prev+val;   //可以写为加减乘除
		},基础值);    //基础值回合最后的结果相加,但是基础值可有可无

4、严格模式:

在任何作用域的顶部加上一句"use strict"
功能:禁止给未声明的变量赋值,解决了全局污染
         静默失败升级为报错

5、不是自己的方法也可以使用:借用或则掠夺

call/apply/bind:
		call/apply:临时条换了函数中的this:借用
			函数名.call(借用对象,实参,.....)
			函数名.apply(借用对象,arr,.......); 实参只能传入数组,apply会悄悄打散数组
		bind:永久替换新函数中的this: 掠夺
			var 新函数=原函数.bind(指定对象,永久实参,....)
		bind绑定的新函数call/apply没有办法借走,只能从原函数中借用
	固定套路:
		Math.max/min.apply(Math,arr);
		Object.prototype.toString.call/apply(arr);
		类数组转为普通数组:类数组名=Array.prototype.slice.call/apply(类数组);

6、ES6:简化ECMAScript

1、模板字符串:可以在字符串中放入变量
	语法:`我的名字叫${name}`
2、块级作用域:
	let 变量名=值;
	禁止声明提前,添加了块级作用域,一个{}就是一个块级,记录着当前触发事件的元素下标
3、箭头函数:
	去掉function,()和{},之间添加=>,形参如果只有一个,则省略掉(),函数体如果只有一句话,省略{},
	函数体只有一个句话并且是returnreturn和{}都省略

7、DOM:将每个元素/标签/文本/属性/注释都会看做是一个DOM节点/元素/对象

HTML/XHTML/DHTML/XML是什么:
	1、HTML:网页
	2、XHTML: 更严格的网页
	3、DHTML: 动态网页	,是HTML+CSS+JS的整合
	4、XML:数据格式,被JSON数据格式代替了
每个DOM元素都有三大属性:
	1、elem.nodeType; 描述节点类型
	2、elem.nodeValue; 获取属性节点的值
	3、elem.nodeName;获取节点名称或标签名
通过关获取元素:
	找父元素:elem.parentNode;
	找子元素:elem.children;
	第一个子元素:elem.firstElementChild;
	最后一个子元素:elem.lastElementChild;
	前一个兄弟:elem.previousElementSibling;
	后一个兄弟:elem.nextElementSibling;
递归:函数中再次调用函数本身
	专门用于遍历层级不明确的树状结构
	如何使用:
		function 函数名(根){
			第一层要做什么直接操作
			第二层判断有没有下一级,如果有再次调用次函数,但是传入的实参则是自己的下一级
		}
		函数名(实际的根)
直接找元素:
	通过HTML的一些特点找元素
		var elem=document.getElementsByClassName("class名");
		var elem=document.getElementsById("ID名");
		var elem=document.getElementsByTagName("name名");
		var elems=document.getElementsByName("name值")
	通过CSS选择器查找元素:
		var elem=document.querySelector("任意css选择器");
			指挥找到一个元素,没找到为null
		var elem=document.querySelectorAll("任意css选择器");
			找是一个集合,没找到是一个空集合


总结:	
	1、直接找元素:getXXX或者queryXXX
	2、通过节点关系
	3、层级不明确的情况用递归
            
操作元素:
	1、元素的内容:
		elem.innerHTML:获取或设置标签里的HTML代码,识别标签里的标签
			获取:elem.innerHTML;
			设置:elem.innerHTML="新内容";
		elem.innerText:获取或设置标签里的文本内容,不识别标签的标签
			获取:elem.innerText;
			设置:elem.innerText="新文本内容";
		input.value:获取或设置input的内容
			获取:input.value;
			设置:input.value="新值";
	2、元素的属性:
		获取属性值:elem.getAttribute("属性名");
		设置属性值:elem.setAttribute("属性名","属性值");
		删除属性值:elem.removeAttribute("属性名");
	3、元素的样式:
		操作内联样式:
			获取:elem.style.css属性名
			设置:elem.style.css属性名="css属性值"	

8、创建元素&渲染页面

1、先创建空标签
	var elem=document.createElement("标签名");
2、为其添加必要的属性和事件
	elem.属性名="属性值";
	elem.on事件名=function(){操作}
3、渲染页面
	父元素.appendChild(elem);
		添加到父元素里的最后一个子元素
4、删除元素:
	elem.remove();

9、HTML DOM:简化核心DOM开发

1select对象:
	属性:  select.options;获取select里面所有的option
	            select.selectedIdex; 获取当前选中项的下标
	方法: sel.add(option)  同等于appendChild
	 转述事件:onchange   选中项发生了变化才触发
2option对象	
	var opt=new Option("innerHTML","value")

select对象方法配合option对象可以一句话完成4个操作
	sel.add(new Option("文本内容","value值"));
	1、选创建了空标签option	
	2、为option设置了文本内容innerHTML
	3、为option设置了value值
	4、渲染页面

10、用户确认框:

  var bool=confirm("提示文字");