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>