06_JS面向对象

2017-09-10  本文已影响0人  对方不想理你并向你抛出一个异常

创建函数的几种方式

<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函数的作用就是将所有的参数组合起来,变成一个函数
//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;' );
<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>
上一篇下一篇

猜你喜欢

热点阅读