06_JS面向对象

创建函数的几种方式

<script type="text/javascript">
    //1.直接声明函数
    function funcName(/*参数列表*/){
        //函数体
    }
    //2.函数表达式
    var funcName = function(){

    };
    //3.new Function
    var func = new Function();
</script>

函数的构造函数Function

在 js 中 使用Function可以实例化函数对象。也就是说在 js 中函数与普通对象一样, 也是一个对象类型. 函数是 js 中的一等公民.

  • 函数是对象, 就可以使用对象的动态特性
  • 函数是对象, 就有构造函数创建函数
  • 函数是函数, 可以创建其他对象
  • 函数是唯一可以限定变量作用域的结构

要解决的问题

  • Function 如何使用
  • Function 与函数的关系
  • 函数的原型链结构

Function 的使用

语法

//Function函数所有的参数全都是字符串
//Function函数的作用就是将所有的参数组合起来,变成一个函数
//1、如果只传一个参数,那么这个函数必然是函数体
//2、如果传多个参数,那么最后一个参数表示函数体,前面的参数代表将要创建的函数的参数
//3、如果不传参数,表示创建一个空函数
new Function(arg1, arg2, arg3, ..., argN, body);
创建一个打印一句话的函数
//传统的方式
function foo(){
    console.log("你好");
}
//使用Function
var func = new Function("console.log('你好');");

这里两种方式创建出来的函数功能是一样的。

创建一个空函数
//传统的方式
function foo(){}
//Function
var func = new Function();
创建一个有参数的函数
//传统的方式
function foo(num){
    console.log(num);
}

//Function

var func = new Function(){"num", "console.log(num);"};

解决代码太长的问题

  • 利用字符串特性
function foo ( a, b, c ) {
    var res = a > b ? a : b;
    res = res > c ? res : c;
    return res;
}
var func = new Function( 'a', 'b', 'c', 'return foo( a, b, c );');
  • 利用+连接字符串
var func = new Function( 'a', 'b', 'c',

 'var res = a > b ? a : b;' +

 'res = res > c ? res : c;' +

 'return res;' );
  • ES6 语法(很少有浏览器实现) 使用键盘左上角的` 表示可换行字符串的界定符,之前我们用的是单引号或者双引号来表示一个字符串字面量,在ES6中可以用反引号来表示该字符串可换行。
  • (最终)利用 DOM 的特性完成该方法
<div id="code" style="display:none">
var res = a > b ? a : b;
res = res > c ? res : c;
return res;
</div>
<script>
var txt = document.getElementbyId("code).innerHtml + ' ';
var func = new Function('a', 'b', 'c', txt);
</script>

练习(重点

<script type="text/javascript">
    var func = new Function("console.log('我是动态创建的函数')");
    func();
    //Function这构造函数,可以用来新建函数对象
    //语法
    //  0,一参数都不传,创建一个空的函数,var 函数名 = new Function();
    //  1,只传一个参数,这个参数就是函数体,var 函数名 = new Function("函数体");
    //  2,传多个参数的情况,最后一个参数是函数体,前面的参数都是该函数的参数

    //练习: 利用 Function 创建一个函数, 要求传入两个数字, 打印其和
    var f1 = new Function("num1","num2","console.log(num1+num2);");
    f1(2,5);

    //练习:使用Function创建一个打印4句歌词的函数
    var f2 = new Function("console.log('四句歌词');");
    f2();

    //练习: 利用 Function 创建一个求三个数中最大数的函数.
    var f3 = new Function("a","b","c","return (a>b?a:b)>c?(a>b?a:b):c;");
    console.log(f3(2,12,8));



    //如何解决使用Function创建函数时,代码过长的的问题
    //  1,如何使字符串拼接让代码换行
    //  2,使用模板的方式,将代码写在模板标签内
    //  3,使用反引号(`) 引住字符串,那么就可以 换行了

    //练习:传入一个数组,求数组中的最大数
    var max = new Function("arr",
            "var max=arr[0];"+
            "for(var i=1;i<arr.length;i++){" +
            "max = arr[i]>max?arr[i]:max;"+
            "}" +
            "return max;"
    );
    console.log(max([23, 4, 8, 101, 102]));

    //练习: 利用 Function 创建一个函数, 要求允许函数调用时传入任意个数参数, 并且函数返回这些数字中最大的数字
    window.onload = function () {
        var script = document.getElementById("funcContent");
        var str = script.innerHTML;
        var max = new Function("arr",str);
        console.log(max([1, 23, 12, 24, 8]));
    }

    //练习:利用 Function 创建一个函数,求数组最大值,函数体使用反引号。
    var str = `adfafdsa
    asdfas`;
    console.log(str);
    var max2 = new Function("arr",`
        var max = arr[0];
        for(var i=0;i<arr.length;i++){
            max = arr[i]>max?arr[i]:max;
        }
        return max;
    `);
    console.log(max2([1, 5, 24, 2]));


</script>

<script type="text/template" id="funcContent">
    var max = arr[0];
    for(var i=1;i<arr.length;i++){
        max = arr[i]>max?arr[i]:max;
    }
    return max;
</script>

arguments对象

在每一个函数调用的过程中, 函数代码体内有一个默认的对象arguments, 它存储着实际传入的所有参数。
  arguments是一个伪数组对象. 它表示在函数调用的过程中传入的所有参数的集合。在函数调用过程中不规定参数的个数与类型, 可以使得函数调用变得非常灵活性。

JavaScript中的函数并没有规定必须如何传参:

  • 定义函数的时候不写参数, 一样可以调用时传递参数
  • 定义的时候写了参数, 调用的时候可以不传参
  • 定义的时候写了一个参数, 调用的时候可以随意的传递多个而参数

在代码设计中, 如果需要函数带有任意个参数的时候, 一般就不带任何参数, 所有的参数利用arguments对象来获取. 一般的函数定义语法, 可以写成:

function foo ( /* ... */ ) {
}

练习

<script type="text/javascript">
    // 要求允许函数调用时传入任意个数参数,
    // 并且函数返回这些数字中最大的数字.


    //函数内部的一个对象 arguments
    //当函数调用的时候,系统会将所有传入的实参,依次存入这个数组对象
    function max(){
        console.log(arguments);//参数数组
        var max = arguments[0];
        for(var i=0;i<arguments.length;i++){
            max = max>arguments[i]?max:arguments[i];
        }
        return max;
    }

    console.log(max(1, 8, 2, 5, 9, 6));
    
    //练习,使用Function创建一个函数,
    //给函数传入任意个数的参数,
    //在函数内进行去重操作,然后返回去重后的数组
    var distinct = function(){
        var arr = [];
        for(var i=0;i<arguments.length;i++){
            if(arr.lastIndexOf(arguments[i]) == -1){
                arr.push(arguments[i]);
            }
        }
        return arr;
    }
    console.log(distinct(1, 2, 4, 5, 6, 5, 4));

    //1.一个函数有形参的时候,调用的时候,可以不传参数
    //2.一个函数没有形参的时候,调用时后,可以传参   arguments对象
    //3.一个函数不管有没有形参,调用的时候都会把实参的值存入arguments对象
</script>

eval

<script type="text/javascript">
    //eval函数可以用来将字符串转换成JavaScript代码并且运行
    var str = "var a = 10";
    eval(str);
    console.log(a);
    //JSON格式的数据  JSON对象有兼容性问题
    var jsonData = '{"name":"zs", "age":18}';
    var o = JSON.parse(jsonData);
    console.log(o);

    //使用eval来解析JSON格式字符串的时候,会将{}解析为代码块,而不是对象的字面量
    //1.在JSON格式的字符串前面拼接上 "var o ="
    //2.把JSON格式的字符串使用()括起来,就不会将{}解析为代码块,而是表达式

    eval("var obj = "+jsonData);
    console.log(obj);

    var jsonData2 = '({"name":"zs", "age":18})';
    var obj2 = eval(jsonData2);
    console.log(obj2);
</script>

静态成员和实例成员


<script type="text/javascript">
    function Person(){
        this.name = "zs";
        this.run = function () {
            console.log("跑");
        }
    }

    //        Person.prototype
    console.log(Person.name);

    var p = new Person();
    //        p.name

    //静态成员和实例成员的概念,是从其他编程语言中引入的
    //静态成员:
    //是指构造函数的属性和方法
    //实例成员:
    //是指实例的属性和方法

    //__proto__

    //        $("#id").css();
    //        $("#id").text();

    //        $.trim();
    //        $.each();
    //        $.extend();

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

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,233评论 0 4
  • //Clojure入门教程: Clojure – Functional Programming for the J...
    葡萄喃喃呓语阅读 3,660评论 0 7
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,752评论 2 17
  • 不忘初心,做什么事情都不要怕,想想自己是来干嘛的,不要软弱,要微笑,不要不开心,凡事都是上天对你的考验,想太多对自...
    jjyyyyy阅读 161评论 0 1
  • 今天突然很想写一些东西 不知道从何说起 那就说说你吧 今天在洗漱间洗衣服 没有听歌 所以脑子里有很多乱七八糟的东西...
    不然就叫帅气的昵称吧阅读 139评论 0 0