Javascript基础(3)
Javascript基础(3)
class
calss
ES6提供了更接近传统语言的写法,引入了Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。基本上,ES6的class可以看作只是一个语法糖,它的绝大部分功能,ES5都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。上面的代码用ES6的“类”改写,就是下面这样。
//定义类
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
}
toString() {
return '(' + this.x + ', ' + this.y + ')';
}
}
上面代码定义了一个“类”,可以看到里面有一个constructor方法,这就是构造方法,而this关键字则代表实例对象。也就是说,ES5的构造函数Point,对应ES6的Point类的构造方法。
Point类除了构造方法,还定义了一个toString方法。注意,定义“类”的方法的时候,前面不需要加上function这个关键字,直接把函数定义放进去了就可以了。另外,方法之间不需要逗号分隔,加了会报错。
ES6的类,完全可以看作构造函数的另一种写法。
class Point {
// ...
}
typeof Point // "function"
Point === Point.prototype.constructor // true
上面代码表明,类的数据类型就是函数,类本身就指向构造函数。
使用的时候,也是直接对类使用new命令,跟构造函数的用法完全一致。
class Bar {
doStuff() {
console.log('stuff');
}
}
var b = new Bar();
b.doStuff() // "stuff"
构造函数的prototype属性,在ES6的“类”上面继续存在。事实上,类的所有方法都定义在类的prototype属性上面。
class Point {
constructor(){
// ...
}
toString(){
// ...
}
toValue(){
// ...
}
}
// 等同于
Point.prototype = {
toString(){},
toValue(){}
};
在类的实例上面调用方法,其实就是调用原型上的方法。
class B {}
let b = new B();
b.constructor === B.prototype.constructor // true
上面代码中,b是B类的实例,它的constructor方法就是B类原型的constructor方法。
由于类的方法都定义在prototype对象上面,所以类的新方法可以添加在prototype对象上面。Object.assign方法可以很方便地一次向类添加多个方法。
class Point {
constructor(){
// ...
}
}
Object.assign(Point.prototype, {
toString(){},
toValue(){}
});
prototype对象的constructor属性,直接指向“类”的本身,这与ES5的行为是一致的。
Point.prototype.constructor === Point // true
另外,类的内部所有定义的方法,都是不可枚举的(non-enumerable)。
class Point {
constructor(x, y) {
// ...
}
toString() {
// ...
}
}
Object.keys(Point.prototype)
// []
Object.getOwnPropertyNames(Point.prototype)
// ["constructor","toString"]
上面代码中,toString方法是Point类内部定义的方法,它是不可枚举的。这一点与ES5的行为不一致。
var Point = function (x, y) {
// ...
};
Point.prototype.toString = function() {
// ...
};
Object.keys(Point.prototype)
// ["toString"]
Object.getOwnPropertyNames(Point.prototype)
// ["constructor","toString"]
上面代码采用ES5的写法,toString方法就是可枚举的。
类的属性名,可以采用表达式。
let methodName = "getArea";
class Square{
constructor(length) {
// ...
}
[methodName]() {
// ...
}
}
上面代码中,Square类的方法名getArea,是从表达式得到的。
constructor方法
constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加。
constructor() {}
constructor方法默认返回实例对象(即this),完全可以指定返回另外一个对象。
class Foo {
constructor() {
return Object.create(null);
}
}
new Foo() instanceof Foo
// false
上面代码中,constructor函数返回一个全新的对象,结果导致实例对象不是Foo类的实例。
类的构造函数,不使用new是没法调用的,会报错。这是它跟普通构造函数的一个主要区别,后者不用new也可以执行。
class Foo {
constructor() {
return Object.create(null);
}
}
Foo()
// TypeError: Class constructor Foo cannot be invoked without 'new'
文章来源:ES6 Class - ES6文档 (caibaojian.com)
JavaScript Window Navigator
<p id="demo"></p>
<script>
document.getElementById("demo").innerHTML = "cookiesEnabled is " + navigator.cookieEnabled;
</script>
cookieEnabled 属性返回 true,如果 cookie 已启用,否则返回 false:
appName 属性返回浏览器的应用程序名称:
appCodeName 属性返回浏览器的应用程序代码名称:
product 属性返回浏览器引擎的产品名称:
appVersion 属性返回有关浏览器的版本信息:
userAgent 属性返回由浏览器发送到服务器的用户代理报头(user-agent header):
platform 属性返回浏览器平台(操作系统):
language 属性返回浏览器语言:
onLine 属性返回 true,假如浏览器在线:
javaEnabled() 方法返回 true,如果 Java 已启用:
大多数时候,我们不使用Navigator对象,因为其中的信息可以进行修改
Window Screen
window.screen 对象不带 window 前缀也可以写:
属性:
- screen.width
- screen.height
- screen.availWidth
- screen.availHeight
- screen.colorDepth
- screen.pixelDepth
Location 对象
Location 对象包含有关当前 URL 的信息。
Location 对象是 Window 对象的一个部分,可通过 window.location 属性来访问。
例子
Location 对象属性
| 属性 | 描述 |
|---|---|
| hash | 设置或返回从井号 (#) 开始的 URL(锚)。 |
| host | 设置或返回主机名和当前 URL 的端口号。 |
| hostname | 设置或返回当前 URL 的主机名。 |
| href | 设置或返回完整的 URL。 |
| pathname | 设置或返回当前 URL 的路径部分。 |
| port | 设置或返回当前 URL 的端口号。 |
| protocol | 设置或返回当前 URL 的协议。 |
| search | 设置或返回从问号 (?) 开始的 URL(查询部分)。 |
Location 对象方法
| 属性 | 描述 |
|---|---|
| assign() | 加载新的文档。 |
| reload() | 重新加载当前文档。 |
| replace() | 用新的文档替换当前文档。 |
Location 对象描述
Location 对象存储在 Window 对象的 Location 属性中,表示那个窗口中当前显示的文档的 Web 地址。它的 href 属性存放的是文档的完整 URL,其他属性则分别描述了 URL 的各个部分。这些属性与 Anchor 对象(或 Area 对象)的 URL 属性非常相似。当一个 Location 对象被转换成字符串,href 属性的值被返回。这意味着你可以使用表达式 location 来替代 location.href。
不过 Anchor 对象表示的是文档中的超链接,Location 对象表示的却是浏览器当前显示的文档的 URL(或位置)。但是 Location 对象所能做的远远不止这些,它还能控制浏览器显示的文档的位置。如果把一个含有 URL 的字符串赋予 Location 对象或它的 href 属性,浏览器就会把新的 URL 所指的文档装载进来,并显示出来。
除了设置 location 或 location.href 用完整的 URL 替换当前的 URL 之外,还可以修改部分 URL,只需要给 Location 对象的其他属性赋值即可。这样做就会创建新的 URL,其中的一部分与原来的 URL 不同,浏览器会将它装载并显示出来。例如,假设设置了Location对象的 hash 属性,那么浏览器就会转移到当前文档中的一个指定的位置。同样,如果设置了 search 属性,那么浏览器就会重新装载附加了新的查询字符串的 URL。
除了 URL 属性外,Location 对象的 reload() 方法可以重新装载当前文档,replace() 可以装载一个新文档而无须为它创建一个新的历史记录,也就是说,在浏览器的历史列表中,新文档将替换当前文档。
2、 loation 跳转位置
window.location.href="popl.html";
location = pop.html
location.replace("pop.html") //浏览器不可以后退
3、 history 历史
history.back() == history.go(-1) //返回到前一页
history.go(-2) //括号里的参数负几就是返回前几步
eg: <a href="javascript:history.back()">返回上一页</a>
<a href="javascript:history.go(-2)">第一页</a>
<meta http-equiv="refresh" content="3; url =http://www.hteis.cn";> //不加url指3秒刷新一次,加url指3秒跳转
一些 DOM 对象方法
这里提供一些您将在本教程中学到的常用方法:
| 方法 | 描述 |
|---|---|
| getElementById() | 返回带有指定 ID 的元素。 |
| getElementsByTagName() | 返回包含带有指定标签名称的所有元素的节点列表(集合/节点数组)。 |
| getElementsByClassName() | 返回包含带有指定类名的所有元素的节点列表。 |
| appendChild() | 把新的子节点添加到指定节点。 |
| removeChild() | 删除子节点。 |
| replaceChild() | 替换子节点。 |
| insertBefore() | 在指定的子节点前面插入新的子节点。 |
| createAttribute() | 创建属性节点。 |
| createElement() | 创建元素节点。 |
| createTextNode() | 创建文本节点。 |
| getAttribute() | 返回指定的属性值。 |
| setAttribute() | 把指定属性设置或修改为指定的值。 |
cookie
var cookieArray = document.cookie; //获取cookie存储字符串
劫持cookie原理
DOM操作
DOM含义:DOM是文档对象模型(Document Object Model,是基于浏览器编程的一套API接口,是W3C出台的推荐标准。其赋予了JS操作节点的能力。当网页被加载时,浏览器就会创建页面的文档对象模型。
节点:根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点:
1、整个文档时一个文档节点。
2、每个HTML元素是元素节点。
3、HTML元素内的文本是文本节点。
4、每个HTML属性是属性节点。
5、每个注释是注释节点。
所以HTML DOM 将 HTML 文档视作树结构,这种结构被称为节点树。通过 HTML DOM,节点树中的所有节点都可以通过 JS 进行访问。所有 HTML 元素(节点)均可被修改。
一、创建节点、追加节点
1、createElement(标签名)创建一个元素节点(具体的一个元素)。
2、appendChild(节点)追加一个节点。
3、createTextNode(节点文本内容)创建一个文本节点
varoDiv = document.createElement("div");//创建一个div元素,因为是document对象的方法。
varoDivText = document.createTextNode("666");//创建一个文本节点内容是“666”,因为是document对象的方法。oDiv.appendChild(oDivText);//父级.appendChild(子节点);在div元素中添加“666”
document.body.appendChild(oDiv);//父级.appendChild(子节点);document.body是指向<body>元素document.documentElement.appendChild(createNode);
``//父级.appendChild(子节点);
;document.documentElement是指向元素
var oDiv = document.createElement("div");
//创建一个div元素,因为是document对象的方法。
var oDivText = document.createTextNode("666");
//创建一个文本节点内容是“666”,因为是document对象的方法。
oDiv.appendChild(oDivText); //父级.appendChild(子节点);在div元素中添加“666”
document.body.appendChild(oDiv);//父级.appendChild(子节点);
document.body是指向<body>元素document.documentElement.appendChild(createNode);//父级.appendChild(子节点);
;document.documentElement是指向<html>元素
二、插入节点
1、appendChild(节点)也是一种插入节点的方式,还可以添加已经存在的元素,会将其元素从原来的位置移到新的位置。
2、insertBefore(a,b)是参照节点,意思是a节点会插入b节点的前面。
var oDiv = document.createElement("div");//创建一个div元素,因为是document对象的方法。
var oDiv1 = document.getElementById("div1");
document.body.insertBefore(oDiv,oDiv1);//在oDiv1节点前插入新创建的元素节点
ul.appendChild(ul.firstChild); //把ul的第一个元素节点移到ul子节点的末尾
三、删除、移除节点
1、removeChild(节点) 删除一个节点,用于移除删除一个参数(节点)。其返回的被移除的节点,被移除的节点仍在文档中,只是文档中已没有其位置了。
var removeChild = document.body.removeChild(div1);//移除document对象的方法div1
四、替换节点
1、replaceChild(插入的节点,被替换的节点) ,用于替换节点,接受两个参数,第一参数是要插入的节点,第二个是要被替换的节点。返回的是被替换的节点。
var replaceChild= document.body.replaceChild(div1,div2); //将div1替换div2
五、查找节点
1、childNodes 包含文本节点和元素节点的子节点。
for(var i = 0; i < oList.childNodes.length; i++) {//oList是做的ul的对象。//nodeType是节点的类型,利用nodeType来判断节点类型,再去控制子节点//nodeType==1 是元素节点//nodeType==3 是文本节点 if(oList.childNodes[i].nodeType == 1) //查找到oList内的元素节点
console.log(oList.childNodes[i]);
//在控制器日志中显示找到的元素节点
}
}
2、
A、children也可以获取子节点,而且兼容各种浏览器。包括IE6-8
B、parentNode:获取父节点
var oList = document.getElementById('list');//oList是做的ul的对象
var oChild=document.getElementById('child');//oChild是做的ul中的一个li的对象
//通过子节点查找父节点//parentNode:获取父节点console.log(oChild.parentNode);//在控制器日志中显示父节点console.log(oList.children);//在控制器日志中显示oList子节点
console.log(children.length)//子节点的个数
3、
A、firstChild ; firstElementChild查找第一个子节点。此存在浏览器兼容问题:firstChild是IE兼容,firstElementChild是非IE兼容。
//查找第一个子节点的封装函数
function firstChild(ele) {if (ele.firstElementChild) {//如果该条件是true则在该浏览器(IE或非IE)中兼容 return ele.firstElementChild;}else {return ele.firstChild;
}
}firstChild(oList).style.background = 'red';//将获得的节点的背景变成红色
B、lastChild ; lastElementChild查找最后一个子节点。此存在浏览器兼容问题:lastChild 是IE兼容,lastElementChild是非IE兼容。
//查找最后一个子节点的封装函数
function lastChild(ele) {
if (ele.lastElementChild) {
//如果该条件是true则在该浏览器(IE或非IE)中兼容
return ele.lastElementChild;}
else{ return ele.lastChild;
}
}
lastChild(oList).style.background = 'red';//将获得的节点的背景变成红色
C、nextSibling ; nextElementSibling查找下一个兄弟节点。也是存在兼容性问题。
//查找下一个兄弟节点的封装函数
function nextSibling(ele) {
if (ele.nextElementSibling){
return ele.nextElementSibling;}
else {return ele.nextSibling; }
}
nextSibling(oMid).style.background ='red';
D、previousSibling ; previousElementSibling查找上一个兄弟节点。也是存在兼容性问题。
//查找上一个兄弟节点的封装函数function previousSibling(ele) {
if(ele.nextElementSibling) {return ele.previousElementSibling;}
else{return ele.previousSibling;}
}
previousSibling(oMid).style.background = 'red';
删除节点
需要通过找到父节点来删除子节点
var self=document.getElementById('p1');
var father=p1.parentElement;
father.removeChild(p1);
father.removechild(father.children[0]);
var js=document.getElementById('js');
var list=document.getElementById('list');
var newP=document.createElement('p');
newP.id='newP';
newP.innerText='Hell,kuangshen';
一个见简单的当前技术的前端案例
- 在密码处采用了md5加密
- onsubmit=“return login()” 在login函数返回false是不发出提交,表单级别的提交事件
- 在传输密码加密是采用隐藏input,达到更好的用户体验
- 注意:目前采用md5加密算法容易被破解,应采用更好的md5算法
<script src="https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.js"></script>
<body>
<form action="https://baidu.com" method="post" onsubmit="return login()">
<p>
<span>用户名:</span><input type="text" value="" id="login_num" name="login_num" required/>
</p>
<p>
<span>密码:</span><input type="password" id="pwd" name="pwd1" required>
</p>
<p>
<input type="password" id="password" name="pwd" hidden>
</p>
<input type="submit">
</form>
<script>
function login(){
var login_num= document.getElementById('login_num')
console.log(login_num.value);
var pwd=document.getElementById('pwd');
var password=document.getElementById('password');
password.value=md5(pwd.value);
console.log(pwd.value);
return true;
}
</script>

浙公网安备 33010602011771号