鱼C论坛

 找回密码
 立即注册
查看: 4008|回复: 5

[学习笔记] JS学习第七章

[复制链接]
发表于 2021-2-15 07:10:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Js中的this
--------------------------
个人感觉在学习Js中this的时候,跟python里面的self有这异曲同工之妙
当时在学习python一直搞不懂为什么必须要传self,学完js this感觉意义相同,也解除了当时困惑了许久的问题

  1. /*
  2.             解析器在调用函数时每次都会向函数内部传递进一个隐含的参数
  3.                 这个隐含的参数就是this, this指向的是一个对象,
  4.                 这个对象我们称为函数执行的上下文对象,
  5.                 根据函数的调用方式的不同,this会指向不同的对象
  6.                     1.以函数形式调用,this永远都是window
  7.                     2.以方法形式调用,this就是调用方法的那个对象
  8.         */

  9.         function fun(a,b){
  10.             //console.log("a = " + a + ", b = " + b);
  11.             console.log(this.name);
  12.         }

  13.         fun(123,456);


  14.         //创建一个对象
  15.         var obj = {
  16.                 name:"孙悟空",
  17.                 sayName:fun
  18.         };

  19.         var name = "全局name属性";

  20.         //console.log(obj.sayName == fun);

  21.         //以方法的形式调用,this是调用方法的对象
  22.         obj.sayName();//孙悟空
  23.         
  24.         //以函数的形式调用,this是window,这里会输出“全局name属性”
  25.         fun();//全局name属性
复制代码


------------------------------------
JS使用工厂方法创建对象

    学习完对象后会发现每次创建一个类似的对象非常的麻烦,
    会有很多重复的东西,而编程为了就是简单所以我们可以批量生产对象

        
  1. /*
  2.             使用工厂方法创建对象
  3.                 a通过该方法可以大批量创建对象
  4.         */
  5.         function createPerson(name,age,gender){
  6.             //创建一个新的对象
  7.             var obj = new Object();
  8.             
  9.             //向对象中添加属性
  10.             obj.name = name;
  11.             obj.age = age;
  12.             obj.gender = gender;
  13.             obj.sayName = function(){
  14.                 //这里通过this.name可以返回对象中的name
  15.                 alert(this.name);
  16.             }
  17.             
  18.             //将新的对象返回
  19.             return obj;
  20.         }

  21.         var obj2 = createPerson("猪八戒",26,"男");
  22.         var obj3 = createPerson("沙和尚",38,"男");

  23.         console.log(obj2);
  24.         console.log(obj3);
  25.         
  26.         obj3.sayName();
  27.         obj2.sayName();

  28.         /*
  29.             用来创建狗的对象
  30.         */

  31.         function creatDog(name,age){
  32.             var obj = {
  33.                 name : name,
  34.                 age : age,
  35.                 sayHello : function(){
  36.                     alert("旺旺~~");
  37.                 }
  38.             };

  39.             return obj;
  40.         }

  41.         /*
  42.             使用工厂方法创建的对象,使用构造函数都是Object
  43.                 所以创建的对象都是Object这个类型,
  44.                 就导致我们无法取费除多种不同类型的对象
  45.         */

  46.         //创建一个狗的对象
  47.         var doge = creatDoge("旺财",3);
  48.         dog.sayHello();
  49.         console.log(dog);

  50.         注意:
  51.             使用这种方法来创建对象其实并不推荐,因为在实际开发中肯定会跟其他人一起合作来开发,
  52.                 这样的创建函数方法会特别浪费命名空间,以至于在合作中导致命名重叠而引发报错等一系列小麻烦,
  53.                 接下来我们讲介绍构造函数来解决此问题
  54. --------------------------------------------------
  55. Js中的构造函数

  56.     JS中的构造函数其实就是Python中的类,当时学的时候很懵逼学完发现
  57.         咦?这不就是Python的类么瞬间恍然大悟哈哈哈哈~不知道有没有相同的小伙伴~~
  58.    
  59.          /*
  60.             创建一个构造函数,专门用来创建Person对象的
  61.                 构造函数就是一个普通的函数,创建方式和普通函数没有区别
  62.                 不同的是构造函数习惯上首字母大写

  63.             构造函数和普通函数的区别就是调用方式的不同
  64.                 普通函数是直接调用
  65.                 构造函数需要使用new关键字来调用

  66.             
  67.             构造函数的执行流程:
  68.                 1.立刻创建一个新的对象
  69.                 2.将新建的对象设置为函数中的this,在构造函数中可以使用this来引用新建的对象
  70.                 3.逐行执行函数中的代码
  71.                 4.将新建的对象作为返回值返回

  72.             使用同一个构造函数的对象,我们成为一类对象,也将一个构造函数成为一个类
  73.                 我们将通过一个构造函数创建的对象,承诺为是该类的实例
  74.             
  75.             this的情况:
  76.                 1.当以函数的形式调用时,this是window
  77.                 2.当以方法的形式调用时,谁调用方法this就是谁
  78.                 3.当以构造函数的形式调用时,this就是新创建的实例
  79.         */
  80.        function Person(name,age,gender){
  81.             this.name = name;
  82.             this.age = age;
  83.             this.gender = gender;
  84.             this.sayName = function(){
  85.                 alert(this.name);
  86.             }
  87.        }

  88.        function Dog(){

  89.        }


  90.         var per = new Person("孙悟空",18,"男");
  91.         var per2 = new Person("玉兔",16,"女");
  92.         var per3 = new Person("嫦娥",20,"女");


  93.         var dog = new Dog();

  94.         /* console.log(per);
  95.         console.log(dog); */
  96.         
  97.         /*
  98.             使用instanceof可以检查一个对象是否是一个类的实例
  99.             语法:
  100.                 对象 instanceof 构造函数
  101.             如果是,则返回true,否则返回fasle
  102.         */
  103.         console.log(per instanceof Person);//true
  104.         console.log(dog instanceof Person);//false

  105.         /*
  106.             所有的对象都是Object的后代,
  107.                 所以任何对象和Object做instanceof检查时都会返回true
  108.         */
  109.         console.log(per instanceof Object);//true
  110.         console.log(dog instanceof Object);//true

  111.     上述代码创建构造函数时会发现一个问题,每当创建一个Person实例时,都会重新创建一个sayName的对象
  112.     这对我们来说是完全多余的所以我们修改了上述代码


  113.         /*
  114.         创建一个Person构建函数
  115.             -在Person构造函数中,为每一个对象都添加了一个sayName方法
  116.                 目前我们的方法是在构造函数内部创建的,
  117.                     也就是构造函数每执行一次,就会创建一个新的sayName方法
  118.                 也就是所有实例的sayName都是唯一的.
  119.                 这样就导致了构造函数执行一次就会创建一个新的方法
  120.                     执行一万次,就会创建一万个新的方法,而1万个方法都是一模一样的
  121.                     这是完全没有必要的,完全可以使所有的对象共享同一个方法
  122.        */

  123.        function Person(name,age,gender){
  124.             this.name = name;
  125.             this.age = age;
  126.             this.gender = gender;
  127.        }

  128.        //将sayName方法在全局作用域中定义

  129.        /*
  130.             将函数定义在全局作用域中,污染了全局作用的命名空间
  131.                 而且定义在全局作用域中,也很不安全
  132.             function fun(){
  133.                 alert("大家好,我是" + this.name);
  134.             }
  135.        */
  136.         
  137.         //向prototype(原型对象)中添加一个方法
  138.         Person.prototype.sayName = function(){
  139.             alert("大家好,我是" + this.name);
  140.         }

  141.        //创建Person的实例
  142.        var person = new Person("孙悟空",18,"男");
  143.        var person2 = new Person("猪八戒",18,"男");

  144.        person.sayName();
  145.        person2.sayName();
复制代码


-----------------------------------
Js中的原型对象


      
  1. /*
  2.             原型prototype

  3.             我们所创建的每一个函数,解析器都会向函数中添加一个属性prototype
  4.                 这个属性对应着一个对象,这个对象就是我们所谓的原型对象
  5.             如果函数作为普通函数调用prototype没有任何作用
  6.             
  7.             当函数通过构造函数调用时,它所创建的对象中都会有一个隐含的属性,
  8.                 指向该构造函数的原型对象,我们可以通过__proto__来访问该属性

  9.             原型对象就相当于一个公共的区域,所有同一个类的实例都可以访问到这个原型对象
  10.                 我们可以将对象中共有的内容,统一设置到原型对象中。
  11.             
  12.             当我们访问对象一个属性或方法时,它会在对象自身中寻找,如果有则直接使用。
  13.                 如果没有则会去原型对象中寻找,如果找到则直接使用

  14.             以后我们创建构造函数时,可以将这些对象共有的属性和方法,统一添加到构造函数的原型对象中,
  15.                 这样不用分别为每一个对象添加,也不会影响到全局作用域,就可以使每个对象具有这些属性和方法了。
  16.         */

  17.         function MyCalss(){

  18.         }

  19.         //向MyClass原型中添加属性a
  20.         MyClass.prototype.a = 123;

  21.         //向MyClass原型中添加方法
  22.         MyClass.prototype.sayHello = function(){
  23.             alert("hello");
  24.         }

  25.         var mc = new MyClass();

  26.         //console.log(MyClass.prototype);

  27.         console.log(mc.__proto__ == MyClass.prototype);

  28.         //向mc中添加a属性

  29.         mc.a = "我是mc中的a";

  30.         console.log(mc.a);
  31.         

  32.         mc.sayHello();
复制代码



原型对象的补充:
       
      
  1. /*
  2.             创建一个构造函数
  3.         */

  4.         function MyClass(){


  5.         }
  6.         
  7.         //向MyClass的原型中添加一个name属性
  8.         MyClass.prototype.name = "我是原型中的名字";

  9.         mc.age = 18;


  10.         var mc = new MyClass();


  11.         //console.log(mc.name);

  12.         /*
  13.             使用in检查对象中是否有某个属性时没如果对象中没有但是原型中有,也会返回true
  14.             console.log("name " in mc);//true
  15.         */


  16.         //可以使用对象的hasOwnProperty()来检查对象自身中是否含有该属性
  17.         //使用该方法只有对象自身中含有属性时,才会返回true
  18.         console.log(mc.hasOwnProperty("name"));

  19.         console.log(mc.hasOwnProperty("hasOwnProperty"));//false

  20.         console.log(mc.__proto__.hasOwnProperty("hasOwnProperty"));//false

  21.         /*
  22.             原型对象也是对象,所以它也有原型,
  23.                 当我们使用一个对象的属性或方法时,会在自身中寻找,
  24.                     自身中如果有,则直接使用,
  25.                     如果没有则去原型对象中寻找,如果原型对象中有,则使用,
  26.                         如果没有则去原型的原型中寻找,直到找到Object对象的原型
  27.                     Object对象的原型没有原型,如果在Object中依然没有找到,则返回undefined.
  28.         */

  29.         console.log(mc.__proto__.proto__.hasOwnProperty("hasOwnhProperty"));//true

  30.         console.log(mc.__proto__.__proto__)
复制代码


------------------------------------------------
Js修改toString()原型对象

    不知道各位小可爱是否记得当初在使用toString()方法时,会[object,object]
    这次我们可以通过修改原型对象从而把[object,object]改值改成我们想要的值


      
  1. function Person(name,age,gender){
  2.             this.name = name;
  3.             this.age = age;
  4.             this.gender = gender;
  5.         }

  6.         //创建person实例
  7.         var per = new Person("孙悟空",18,"男");
  8.         var per2 = new Person("猪八戒",22,"男");

  9.         //修改Person原型的toString
  10.         Person.prototype.toString = function(){
  11.             return "Person[name="+this.name+",age="+this.name+",gender="+this.gender+"]";
  12.         }
  13.         

  14.         //当我们直接在页面中打印一个对象时,实际上是输出的对象的toString()方法的返回值
  15.         //如果我们希望在输出对象时,不输出[Object Object],可以为对象添加一个toString()方法
  16.         //Person[name=孙悟空,age=18,gender=男]
  17.         /* per.toString = function(){
  18.             return "Person[name="+this.name+",age="+this.name+",gender="+this.gender+"]";
  19.         } */


  20.         var result = per.toString();
  21.         console.log("result = " + result );
  22.         //console.log(per.__proto__.__proto__.hasOwnProperty("toString"));

  23.         console.log(per);
  24.         console.log(per2);
复制代码

-----------------------------------------------
JS垃圾回收

    生活处处有垃圾,JS中也不例外下面讲告诉小可爱们JS中是怎么区分垃圾的~~

      
  1. /*
  2.             垃圾回收(GC)
  3.                 -就像人生活的时间长了,会产生垃圾一样,程序运行过程中也会产生垃圾
  4.                     这些垃圾积攒过多以后,会导致程序速度过慢
  5.                     所以我们需要一个垃圾回收的机制,来处理程序运行过程中产生的垃圾
  6.                
  7.                 -当一个对象没有任何的变量或者属性对它进行引用,此时我们将永远无法操作该对象,
  8.                     此时这种对象就是一个垃圾,这种对象过多会占用大量的内存空间,导致程序运行变慢
  9.                     所以这种垃圾必须进行清理
  10.                
  11.                 -在JS中拥有自动的垃圾回收机制,会自动将这些垃圾对象从我内从中销毁,
  12.                     我们不需要也不能进行垃圾回收的操作
  13.                
  14.                 -我们需要做的只有将不再使用的对象设置为null即可.
  15.                
  16.         */

  17.         var obj = new Object();

  18.         //对对象进行各种操作......

  19.         obj = null;
复制代码

   
    大家在生活中也要记得勤清理垃圾鸭~
-----------------------------------------
JS中的数组简介

   
  1. /*
  2.             内建对象
  3.             宿主对象
  4.             自定义对象

  5.             数组(array)
  6.                 -数组也是一个对象
  7.                 -它和我们普通的对象功能类似,也是用来存储一些值的
  8.                 -不同的是普通对象是使用字符串作为属性名的,
  9.                     而数组是使用数字来作为索引操作元素
  10.                 -索引:
  11.                     从0开始的整数就是索引
  12.                 -数组的存储性能比普通对象要好,在开发中我们经常使用数组来存储一些数据
  13.             
  14.             语法:

  15.         */

  16.         //创建数组对象
  17.         var arr = new Array();
  18.         
  19.         //使用typeof检查一个数组,会返回object类型
  20.         //console.log(typeof arr);

  21.         /*
  22.             向数组中添加元素
  23.             语法:
  24.                 数组[索引] = 值;
  25.         */

  26.         //向arr数组中添加元素
  27.         arr[0] = 10;
  28.         arr[1] = 20;
  29.         arr[2] = 33;
  30.         arr[3] = 44;
  31.         //arr[10] = 55;
  32.        // arr[100] = 90;

  33.         

  34.         /*
  35.             读取数组中的元素
  36.             语法:
  37.                 数组[索引]
  38.             如果读取不存在的索引,不会报错而是返回undefined
  39.         */

  40.         console.log(arr[0]);


  41.         /*
  42.             获取数组的长度
  43.             可以使用length属性来获取数组的长度(元素的个数)
  44.             语法:
  45.                 数组.length

  46.             对于连续的数组,使用length可以获取数组的长度(元素的个数)
  47.                 对于非连续数字,使用length会获取到数组的最大的索引+1
  48.                     尽量不要创建非连续的数组
  49.         */
  50.         console.loig(arr.length);
  51.         console.log(arr);

  52.         /*
  53.             修改length
  54.                 如果修改的length大于原长度,则多出的部分会空出来
  55.                 如果修改的length小于原长度,则多出的元素会被删除
  56.         */
  57.       
  58.         arr.length = 3;
  59.       
  60.         console.log(arr.length);
  61.         console.log(arr);

  62.         arr[4] = 50;
  63.         
  64.         //向数组最后的一个位置添加元素
  65.         /*
  66.             语法:
  67.                 数组[数组.length] = 值;
  68.         */
  69.         arr[arr.length] = 70;
  70.         arr[arr.length] = 80;
  71.         arr[arr.length] = 90;
  72.         
  73.         console.log(arr);
复制代码


--------------------------------------
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-2-15 10:24:52 | 显示全部楼层

回帖奖励 +5 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-2-18 14:32:50 | 显示全部楼层

回帖奖励 +5 鱼币

学习的榜样啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-18 17:23:08 | 显示全部楼层

回帖奖励 +5 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-2-18 18:04:07 | 显示全部楼层

回帖奖励 +5 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-2-18 20:38:18 | 显示全部楼层

回帖奖励 +5 鱼币

感谢分享!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-26 13:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表