1.严格模式
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>01_严格模式</title>
6 </head>
7 <body>
8 <!--
9 1. 理解:
10 * 除了正常运行模式(混杂模式),ES5添加了第二种运行模式:"严格模式"(strict mode)。
11 * 顾名思义,这种模式使得Javascript在更严格的语法条件下运行
12 2. 目的/作用
13 * 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为
14 * 消除代码运行的一些不安全之处,为代码的安全运行保驾护航
15 * 为未来新版本的Javascript做好铺垫
16 3. 使用
17 * 在全局或函数的第一条语句定义为: 'use strict';
18 * 如果浏览器不支持, 只解析为一条简单的语句, 没有任何副作用
19 4. 语法和行为改变
20 * 必须用var声明变量
21 * 禁止自定义的函数中的this指向window
22 * 创建eval作用域
23 * 对象不能有重名的属性
24 -->
25
26 <script type="text/javascript">
27 'use strict';
28 var age = 12;
29 console.log(age);
30 function Person(name, age) {
31 this.name = name;
32 this.age = age;
33 console.log(this)
34 }
35 new Person('kobe', 39); // 构造函数调用,this是实例化对象
36 Person('kobe', 39); //this报错
37 setTimeout(function () {
38 console.log(this);//window
39 }, 1000);
40
41 //* 创建eval作用域
42 var name = 'kobe';
43 eval('var name = "anverson";alert(name)');
44 console.log(name);
45
46 var obj = {
47 name : 'kobe',
48 name : 'weide'
49 };
50 console.log(obj);
51
52 </script>
53
54 </body>
55 </html>
2.静态方法,
Object.create(prototype, [descriptors]),
Object.defineProperties(object, descriptors)
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <meta name="viewport" content="width=device-width, initial-scale=1.0">
6 <title>Document</title>
7 </head>
8 <body>
9
10 <!--
11 ES5给Object扩展了好一些静态方法, 常用的2个:
12 1. Object.create(prototype, [descriptors])
13 * 作用: 以指定对象为原型创建新的对象
14 * 为新的对象指定新的属性, 并对属性进行描述
15 value : 指定值
16 writable : 标识当前属性值是否是可修改的, 默认为false
17 configurable: 标识当前属性是否可以被删除 默认为false
18 enumerable: 标识当前属性是否能用for in 枚举 默认为false
19
20 2. Object.defineProperties(object, descriptors)
21 * 作用: 为指定对象定义扩展多个属性
22 * get :用来获取当前属性值得回调函数
23 * set :修改当前属性值得触发的回调函数,并且实参即为修改后的值
24 * 存取器属性:setter,getter一个用来存值,一个用来取值
25 -->
26
27 <script>
28 var obj= {
29 name:'marco',
30 age:14
31
32 }
33
34 //以obj为原型对象,给新的对象obj1扩展新的属性
35 var obj1= Object.create(obj,{
36 sex:{
37 value:'男',
38 writable:true,
39 configurable:true,
40 enumerable:true
41
42 }
43 });
44 console.log(obj1); //{sex: "男"}
45
46 obj1.sex='女'
47 console.log(obj1); //{sex: "女"}
48 // delete obj1.sex
49 // console.log(obj1);
50
51 //遍历属性
52 for(var i in obj1){
53 console.log(i) //sex name age
54 }
55
56
57
58 var obj2={
59 firstname:'kobi',
60 lastname:'buranent'
61 }
62
63 //为obj2扩展一个新的属性fullname
64 Object.defineProperties(obj2,{
65 fullname:{
66 get:function(){ //去读取当前属性值时,自动触发的get函数
67 console.log('get()')
68 return this.firstname+' '+this.lastname;
69 },
70 set: function(data){ //data就是改变的值tim duncan
71 //修改当前属性值自动触发的set回调函数,并且实参即为修改后的值
72 // console.log(data)
73 var names=data.split(' ')//拆成数组
74 this.firstname=names[0]; //this就是传进来的obj2
75 this.lastname=names[1]
76 },
77
78 enumerable:true //可遍历
79 }
80 })
81
82 console.log(obj2);
83 console.log(obj2.fullname); //自动触发一次get函数
84
85 obj2.fullname='tim duncan' //自动触发一次set函数
86 console.log(obj2.fullname); //自动触发一次get函数
87
88 for(var i in obj2){
89 console.log(i) //firstname lastname fullname
90 }
91
92
93 </script>
94 </body>
95 </html>
3.Array扩展
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>04_Array扩展</title>
6 </head>
7 <body>
8 <!--
9 1. Array.prototype.indexOf(value) : 得到值在数组中的第一个下标
10 2. Array.prototype.lastIndexOf(value) : 得到值在数组中的最后一个下标
11 3. Array.prototype.forEach(function(item, index){}) : 遍历数组
12 4. Array.prototype.map(function(item, index){}) : 遍历数组返回一个新的数组,返回加工之后的值
13 5. Array.prototype.filter(function(item, index){}) : 遍历过滤出一个新的子数组, 返回条件为true的值
14 -->
15 <script type="text/javascript">
16 /*
17 需求:
18 1. 输出第一个6的下标
19 2. 输出最后一个6的下标
20 3. 输出所有元素的值和下标
21 4. 根据arr产生一个新数组,要求每个元素都比原来大10
22 5. 根据arr产生一个新数组, 返回的每个元素要大于4
23 */
24
25 var arr = [1, 4, 6, 2, 5, 6];
26 console.log(arr.indexOf(6));//2
27 //Array.prototype.lastIndexOf(value) : 得到值在数组中的最后一个下标
28 console.log(arr.lastIndexOf(6));//5
29
30 //Array.prototype.forEach(function(item, index){}) : 遍历数组
31 arr.forEach(function (item, index) {
32 console.log(item, index);
33 });
34
35 //Array.prototype.map(function(item, index){}) : 遍历数组返回一个新的数组,返回加工之后的值
36 var arr1 = arr.map(function (item, index) {
37 return item + 10
38 });
39 console.log(arr, arr1);
40
41 //Array.prototype.filter(function(item, index){}) : 遍历过滤出一个新的子数组, 返回条件为true的值
42 var arr2 = arr.filter(function (item, index) {
43 return item > 4
44 });
45 console.log(arr, arr2);
46
47
48 </script>
49 </body>
50 </html>
4.call()/apply()是立即调用函数
bind()是将函数返回
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>05_Function扩展</title>
6 </head>
7 <body>
8 <!--
9 1. Function.prototype.bind(obj) :
10 * 作用: 将函数内的this绑定为obj, 并将函数返回
11 2. 面试题: 区别bind()与call()和apply()?
12 * 都能指定函数中的this
13 * call()/apply()是立即调用函数
14 * bind()是将函数返回
15 -->
16 <script type="text/javascript">
17 // function fun(age) {
18 // this.name = 'kobe';
19 // this.age = age;
20 // console.log('dddddddddddddd');
21 // }
22 // var obj = {};
23 // fun.bind(obj, 12)();
24 // console.log(obj.name, obj.age);
25
26 var obj={
27 username:'kobi'
28 }
29
30 function foo(data){
31 console.log(this, data)
32 }
33
34 foo.call(obj,33)
35 foo.apply(obj,[24]) //传入的实参是数组
36 //bind特点,不会立即调用,而是将函数返回, 传参的方式和call一样
37
38 // var bar=foo.bind(obj,34)
39 // console.log(bar)
40 // bar()
41 foo.bind(obj,45)() //不会立即调用,而是将函数返回,需要加()再次调用下
42
43 setTimeout(function(){
44 console.log(this)
45 }.bind(obj),1000) //函数自调用,bing一般用在函数自调用中
46
47
48
49 </script>
50 </body>
51 </html>