zoukankan      html  css  js  c++  java
  • JavaScript学习 Ⅲ

    六. 面向对象

    对象属于一种复合的数据类型,在对象中可以保存多个不同的数据类型的属性。

    对象分类

    1. 内建对象
      • 由ES标准种定义的对象。比如:Math String Number
    2. 宿主对象
      • 由JS的运行环境提供的对象,主要指由浏览器提供的对象。比如:BOM DOM
    3. 自定义对象
      • 开发人员创建的对象

    创建对象的三种方式

    使用new关键字,调用对象的构造函数。

    var obj = new Object();
    var obj = {};				// 对象字面量创建
    var obj = {name:"tom", age=12};		// 使用对象字面量可以在创建时指定对象的属性
    

    添加属性

    对象的属性名不强制要求遵守标识符的规范。

    尽量按照标识符规范去做。

    obj.name = "孙悟空";
    obj.gender = "男";
    obj.age = 18;
    obj["123"] = 789;	// 特殊属性名,使用[]形式操作
    // 使用[]方式操作属性更加灵活
    ver n = 'name';
    console.log(obj[n]);
    

    JS对象的属性值,可以是任意的数据类型,甚至可以是一个对象。

    删除属性

    delete obj.name;
    

    in 运算符

    通过该运算符可以检查一个对象中是否含有指定的属性

    堆栈

    JS中的基本数据类型的值都是直接在栈内存中存储的,值与值之间是独立存在,修改一个变量不影响其他变量。

    引用类型是保存在堆内存中的,栈内存中仅保留该类型在堆内存中的地址信息,修改一个变量时会影响其他变量。

    当比较两个基本数据类型的值时,就是比较值,而比较两个应用数据类型的值时,是比较对象的内存地址。

    访问对象属性

    您能够以两种方式访问属性:

    objectName.propertyName
    objectName["propertyName"]
    

    请不要把字符串、数值和布尔值声明为对象!

    如果通过关键词 "new" 来声明 JavaScript 变量,则该变量会被创建为对象:

    var x = new String();        // 把 x 声明为 String 对象
    var y = new Number();        // 把 y 声明为 Number 对象
    var z = new Boolean();       //	把 z 声明为 Boolean 对象
    

    请避免字符串、数值或逻辑对象。他们会增加代码的复杂性并降低执行速度。

    枚举对象中的属性

    for ... in ... 语句 对象有几个属性,循环体就会执行几次

    for(var n in obj){
    	console.log(n);
        m = console.log(obj[n]);
    }
    // n 为对象的 Key
    // m 为对象的 value
    

    作用域

    作用域指一个变量的作用范围

    JS中一共有两种作用域:

    1. 全局作用域
      • 直接编写在script标签中的 JS 代码,都在全局作用域
      • 全局作用域在页面打开时创建,在页面关闭时销毁
      • 在全局作用域中有一个全局对象window,代表一个浏览器的窗口,由浏览器创建,我们可以直接使用
      • 在全局作用域中 创建的所有变量都会作为 window 对象的属性保存
      • 创建的所有函数都会作为 window 对象的方法
      • 全局作用域中的变量都是全局变量,在任何页面都可以访问的到
    2. 函数作用域
      • 调用函数时,创建函数作用域,函数执行完毕后,作用域销毁
      • 每调用一次函数,就会创建一个新的函数作用域,他们之间是相互独立的
      • 在函数作用域中可以访问到全局作用域的变量

    当函数和全局存在同名变量时,对于该变量的访问符合就近原则

    在函数中访问全局中的同名变量:window.a

    在函数中,不使用 var 声明的变量都会成为全局变量

    var a = 33;
    
    function fun(){
        console.log("a = "+ a);
        a = 10		// 实际等于 window.a = 10
    }
    fun()
    console.log("a = "+ a);
    
    [OUTPUT]:
    a = 33
    a = 10
    

    定义形参就相当于声明变量:

    function fun(e){
    	alert(e);
    }
    // 可以理解为
    function fun(){
        var e;
        alert(e);
    }
    

    声明提前

    变量的声明提前(变量提升):使用var关键字声明的变量,会在所有的代码执行之前被声明,如果声明变量时不使用var关键字,则变量不会被提前声明。

    只进行提前声明,并没有提前赋值。

    <script>
        var a = 123;
        console.log(a);
    </script>
    <!--正常运行 输出123-->
    <script>
        a = 123;		// 相当于 window.a = 123
        console.log(a);
    </script>
    <!--正常运行 输出123-->
    <script>
        console.log(a);
        var a = 123;
    </script>
    <!--输出 a = undefined-->
    <script>
        console.log(a);
        a = 123;
    </script>
    <!--报错-->
    

    函数的声明提前:使用函数声明形式创建的函数会在所有代码执行之前被创建,我们可以在函数声明前调用。

    使用函数表达式创建的函数,不会被提前创建

    <script>
        function fun(){
        	console.log("fun");
        }
        var fun2 = function{
        	console.log("fun2");
        };
        fun();
        fun2();
    </script>
    <!--正常运行-->
        fun()
        function fun(){
        	console.log("fun");
        }
        var fun2 = function{
        	console.log("fun2");
        }
    <!--正常运行-->
        fun2()
        function fun(){
        	console.log("fun");
        }
        var fun2 = function{
        	console.log("fun2");
        }
    <!--报错-->
    

    七. 函数

    函数也是一个对象,函数中可以封装一些功能(代码),在需要时可以执行这些功能。

    使用typeof检查一个函数对象时,会返回function

    创建一个函数对象

    a. 构造函数

    可以将要封装的代码以字符串的形式传递给构造函数。

    封装到函数中的代码不会立即执行,仅在调用时执行。

    var fun = new Function();
    

    在实际开发中,很少使用构造函数来创建一个函数对象

    b. 函数声明

    使用函数声明来创建一个函数

    function 函数名([形参1,形参2·····]){
    	语句······
    }
    

    c. 函数表达式

    使用函数表达式来创建一个函数

    var 函数名 = function([形参1,形参2······]){
        语句······
    };
    

    将匿名函数赋值给变量。

    函数的参数

    • 在传入参数时,函数解析器不会检查实参的类型,所以要注意函数有可能会接收到非法的参数
    • 调用函数时,解析器不会检查实参的数量,多余的实参不会被赋值
    • 如果实际参数的数量少于形式参数的数量,则没有对应实际参数的形式参数值为undefined
    • 函数的实际参数可以是任意数据类型,也可以是一个函数

    函数返回值

    使用return来设置返回值,如果return语句后不跟任何值或没有return语句就相当于返回一个undefined。

    function Fun(){
    	return 1;
    }
    Fun()	// 调用函数,相当于使用函数的返回值
    Fun		// 函数对象,相当于使用函数对象本身
    

    对象中的函数

    对象的属性值可以是任何的数据类型,也可以是个函数

    var obj = new Ojbect();
    obj.sayName = function(){
    	console.log(obj.name);
    };
    

    如果一个函数作为一个对象的属性保存,我们称这个函数是这个对象的方法

    函数与方法只是名称上的区别,实质没有任何区别

    var obj = {
    	name:"tom",
        age:18,
        SayName:function(){
            console.log(obj.name);
        }
    };
    

    函数的方法

    call()apply()

    这两个方法都是函数的方法,需要通过函数对象来调用

    当对两个函数调用call()apply()都会调用函数执行,但是调用call()apply()可以指定一个对象为第一个参数(this)。

    function fun(){
    	alert(this);
    }
    var obj = {}
    fun();					// window
    fun.call(obj);			// Object
    fun.apply(obj);			// Object
    

    call()方法可以将实参在对象之后依次传递

    apply()方法可以将实参封装到一个数组中统一传递

    function fun(a, b){
    	statement;
    }
    var obj = {}
    fun.call(obj, a, b);	
    fun.apply(obj, [a, b]);			
    

    this

    解析器在每次调用函数时,都会向函数内部传递两个隐含的参数。

    第一个隐含的参数就是this

    this指的是一个对象,这个对象我们称为上下文对象

    根据函数的调用方式不同,this会指向不同的对象

    1. 以函数方式调用,this永远都是window
    2. 以方法形式调用,this就是调用方法的那个对象
    3. 以构造函数的形式调用时,this是新创建的那个对象
    4. 使用callapply调用时,this是指定的那个对象

    arguments

    第二个隐含的参数就是arguments

    封装实参的对象 arguments,是一个类数组对象,可以通过索引来操作数据,也可以获取长度;

    在调用函数时,我们所传递的实参都会在arguments中保存

    arguments.length可以用来获取实参的长度

    console.log(arguments[0])	// 第一个参数
    

    里面有一个属性callee,这个属性对应一个函数对象,就是当前正在指向的函数的对象

    function fun(a, b){
        console.log(a);
        console.log(arguments.callee = fun);
    }
    // True
    
  • 相关阅读:
    封装成帧、帧定界、帧同步、透明传输(字符计数法、字符串的首尾填充法、零比特填充的首尾标志法、违规编码法)
    计算机网络之数据链路层的基本概念和功能概述
    物理层设备(中继器、集线器)
    计算机网络之传输介质(双绞线、同轴电缆、光纤、无线电缆、微波、激光、红外线)
    计算机网络之编码与调制
    0953. Verifying an Alien Dictionary (E)
    1704. Determine if String Halves Are Alike (E)
    1551. Minimum Operations to Make Array Equal (M)
    0775. Global and Local Inversions (M)
    0622. Design Circular Queue (M)
  • 原文地址:https://www.cnblogs.com/chalan630/p/12984962.html
Copyright © 2011-2022 走看看