2021-11-28

十、函数补充以及初识对象

1.arguments

arguments对象里面保存这方法的所有参数。arguments对象里面有个一个callee方法,该方法指向当前方法本身。

定义稳定的递归函数:

function calc(num){

    if(num===1){

        return num

    }

    // 因为arguments.callee 就时 指向当前方法本身。

    // 这样的做的好处是,防止外部方法名修改后,导致递归调用失效。

    let sum = num + arguments.callee(num-1)

    return sum

}

<!DOCTYPE html>

<html>

<head>

    <meta charset="UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>arguments</title>

</head>

<body>

    <script>

        function fn1(a,b,c){

            //方法在调用时,如果没有传递实参,形参的值是undefined

            console.log(a,b,c);

            // arguments是函数内部的一个内置对象

            // arguments对象里面保存这方法的所有参数

            // arguments对象里面有个一个callee方法,该方法指向当前方法本身

            console.log(arguments);

            let sum = 0

            for(let i=0;i<arguments.length;i++){

                sum += arguments[i]

            }

            return sum

        }

        let sum = fn1(100,200,300,400,500,600)

        console.log(sum);

        console.log('----------------------------');

        // 计算1-20之间所有数的求和

        function calc(num){

            if(num===1){

                return num

            }

            // arguments.callee指向当前方法本身

            // 所以,在写递归算法时会经常使用。

            return num + arguments.callee(num-1)

        }

        console.log(calc(20));

    </script>

</body>

</html>

2.分页方法

//定义一个分页方法,方法的三个参数分别是:原始数组,页码,每页数量

function pageData(arr,pageIndex,pageSize){

    //思路:就是对原始数组中的数据,做截取

    //定义截取数据的起始位置

    let start = (pageIndex-1)*pageSize

    //定义截取数据的结束位置

    let end = start+pageSize

    return arr.slice(start,end)

}

<!DOCTYPE html>

<html>

<head>

    <meta charset="UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>分页方法</title>

</head>

<body>

    <script>

        // 定义一个数组

        let arr = [11,22,33,44,55,66,77,88,99,111,222,333,444,555,666,777,888,999]

        // 每页3条数据,返回第3页数据

        let r1 = arr.slice(6,9)

        console.log(r1);

        // 每页4条数据,返回第4页数据

        let r2 = arr.slice(12,16)

        console.log(r2);

        // 没有5条数据,返回第3页数据

        let r3 = arr.slice(10,15)

        console.log(r3);

        console.log('------------------------');

        // 定义一个分页方法,参数是:数组,页码,每页数量

        function pageData(arr,pageIndex,pageSize){

            let start = (pageIndex-1)*pageSize  //算出起始下标

            let end = start+pageSize  //算出结束下标

            //根据起始下标和结束下标,从原始数组中截取对应的数据并返回

            return arr.slice(start,end)

        }

        console.log(pageData(arr,3,3));

        console.log(pageData(arr,4,4));

        console.log(pageData(arr,3,5));

    </script>

</body>

</html>

3.初识对象

如果 a.b ,那么a就是对象,b是a的属性。如果 a.c(),那么a就是对象,c是a的方法。对象就是拥有一组属性和方法的集合。

定义对象有两种方式:1.采用字面量赋值方式直接定义。2.采用构造函数的方式new一个对象

1.采用字面量赋值方式定义对象

let obj = {

    //定义属性

    //定义方法

}

通过对象名.属性,调用对象的属性,可以获取属性的值,也可以修改属性的值,也可以添加新的属性。通过对象名.方法(),调用对象的方法,执行方法里面的代码

<!DOCTYPE html>

<html>

<head>

    <meta charset="UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>对象</title>

</head>

<body>

    <script>

        // 对象就是拥有一组属性和方法的集合

        // 如果 a.b ,那么a就是对象,b是a的属性

        // 如果 a.c(),那么a就是对象,c是a的方法

        // 定义对象的第一种方式:采用字面量赋值方式直接定义

        let stu1 = {

            //属性名:属性值的方式,定义属性

            no:1001,

            name:'张三',

            age:20,

            sex:'男',

            //定义学生的方法

            study:function(){

                console.log('每天学习8小时');

            },

            play:function(){

                console.log('每天玩8小时');

            }

        }

        console.log(stu1);

        //调用对象身上的属性

        console.log(stu1.name);

        console.log(stu1.age);

        //调用对象身上的方法

        stu1.study()

        stu1.play()

    </script>

</body>

</html>

案例:定义计算器对象,实现加减乘除。

<!DOCTYPE html>

<html>

<head>

    <meta charset="UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>使用对象制作计算器</title>

</head>

<body>

    <script>

        //定义一个计算器对象

        let calc = {

            //定义计算器的属性

            num1:0,

            num2:0,

            //定义计算器的方法

            jia:function(){

                //在对象的方法中,获取对象的其它成员,要通过this

                console.log(`${this.num1}+${this.num2}=${this.num1+this.num2}`);

            },

            //在SE6中,对象的方法,也可以采用下面的方式

            jian(){

                console.log(`${this.num1}-${this.num2}=${this.num1-this.num2}`);

            },

            cheng(){

                console.log(`${this.num1}*${this.num2}=${this.num1*this.num2}`);

            },

            chu(){

                console.log(`${this.num1}/${this.num2}=${this.num1/this.num2}`);

            }

        }

        //给计算器对象的两个属性赋值

        calc.num1 = 200

        calc.num2 = 20

        calc.jia()

        calc.jian()

        calc.cheng()

        calc.chu()

    </script>

</body>

</html>

2.采用构造函数的方式new一个对象

可以直接new一个Object对象

let obj = new Object()

也可以定义一个构造函数,再出new这个构造函数的对象。构造函数也称为:类,是自定义的一种类型。

//定义学生类

function Student(形参...){

    //定义属性(必须使用this.)

    //定义方法(必须使用this.)

}

//创建学生对象

let s1 = new Student(实参...)

<!DOCTYPE html>

<html>

<head>

    <meta charset="UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>构造函数</title>

</head>

<body>

    <script>

        // 构造函数:首先是个函数,这个函数用来创建出对象

        // 如果使用构造函数创建出对象:使用new关键字。

        // 可以使用系统构造函数Object创建一个对象。效果等同于{}

        let obj1 = new Object() 

        console.log(obj1);

        let obj2 = {}

        console.log(obj2);

        console.log('--------------------------------');

        // 多数情况下,都是先自定义一个构造函数,再通过自定义的构造函数创建出对应的对象

        // 可以将构造函数理解成:类

        function Student(no,name,age,sex){

            //这里的this,用于给构造函数定义成员

            this.no = no

            this.name = name

            this.age = age

            this.sex = sex

            this.sayHi = function(){

                console.log(`大家好!我叫${this.name}`);

            }

        }

        // 通过类(构造函数)可以创建出无数个对象

        let s1 = new Student(1001,'张三',20,'男')

        console.log(s1);

        s1.sayHi()

        let s2 = new Student(1002,'李四',22,'女')

        console.log(s2);

        s2.sayHi()

        let s3 = new Student(1003,'王五',24,'男')

        console.log(s3);

        s3.sayHi()

    </script>

</body>

</html>

练习题:

定义一个棋子类,里面有四个属性,分别是:名称,颜色,X轴位置,Y轴位置

比如:红色的马,当前位置是(X=15,Y=11)  里面有两个方法:分别是:

1.显示当前棋子在什么位置

2.移动方法,该方法,需要传两个参数,就是X轴和Y轴的新坐标,移动方法执行完后,在方法的最下面,调用一次显示当前位置的方法。

<!DOCTYPE html>

<html>

<head>

    <meta charset="UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>构造函数练习</title>

</head>

<body>

    <script>

        // 定义一个棋子构造函数(类)

        function Chess(name,color,x,y){

            //定义属性

            this.name=name

            this.color=color

            this.x=x

            this.y=y

            //定义方法

            //显示当前位置的方法

            this.show=function(){

                console.log(`${this.color}${this.name},当前位置是X:${this.x} Y:${this.y}`);

            }

            //移动棋子的方法

            this.move=function(x,y){

                this.x = x

                this.y = y

                //位置更新后,重新调用显示当前位置的方法

                this.show()

            }

        }

        // 创建一个红马

        let redHorse = new Chess('马','红',15,1)

        redHorse.show()

        redHorse.move(13,2)

        //创建一个黑车

        let blackCar = new Chess('车','黑',1,1)

        blackCar.show()

        blackCar.move(5,1)

    </script>

</body>

</html>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,701评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,649评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,037评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,994评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,018评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,796评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,481评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,370评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,868评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,014评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,153评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,832评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,494评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,039评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,437评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,131评论 2 356

推荐阅读更多精彩内容

  • 八、初识函数 1.定义 function 是定义函数的关键字,函数也称为方法 。 函数分为:1.无参函数 2.带...
    默默_01cf阅读 281评论 0 0
  • 九、高阶函数 定义:就是一个函数的参数是函数,或者返回值是函数,满足其中一个就是高阶函数 开闭原则:对扩展是开发的...
    默默_01cf阅读 158评论 0 0
  • 七、Math和Date 1.排序算法 sort()方法,用于对数组排序。注意:该排序方法,是根据数组中,每一个元素...
    默默_01cf阅读 124评论 0 0
  • 1.实现数组的高阶函数 2.arguments arguments对象里面保存这方法的所有参数 arguments...
    z丶w阅读 161评论 0 0
  • 参考规范:https://tc39.es/ecma262/[https://tc39.es/ecma262/]。 ...
    优迪阅读 971评论 0 1