zoukankan      html  css  js  c++  java
  • javascript中的function对象

    function对象都是Function的实例:

    > Object.getOwnPropertyNames(Function)
    [ 'length',
      'name',
      'arguments',
      'caller',
      'prototype' ]

    所以function对象也应该有这些方法或者是属性:

    <script type="text/javascript">
    var myFunction = function func(name,age){
        //请注意,直接调用这个函数的时候this指向谁
        console.log(myFunction);
        console.log(myFunction.length);
        console.log(myFunction.name);
        console.log(myFunction.arguments);
        console.log(myFunction.caller);
        console.log(myFunction.prototype);
    }
    myFunction.print = function(){
        //调用这个myFunction对象的时候this指向的是myFunction这个函数对象,这个你必须搞明白
        console.log(this);
        console.log(this.length);
        console.log(this.name);
        console.log(this.arguments);
        console.log(this.caller);
        console.log(this.prototype);
    }
    myFunction.prototype.print_name = function(){
        console.log('print_name');
    }
    myFunction('name',22);
    myFunction.print();
    </script>

    所以如果你想要拓展函数,可以给函数添加一些方法:

    var myFunction = function func(name,age){}
    myFunction.print = function(){
        console.log("name");
    }
    myFunction.print();

    如果你想要让所有的函数都有某些属性,那就必须修改Function.prototype了

    var myFunction = function func(name,age){}
    Function.prototype.print = function(){
        console.log("name");
    }
    myFunction.print();

    把函数对象也当成对象,感觉特别不习惯,因为习惯上我会这样做(你让我想象一下,在java中类里面的方法也是对象,可以被调用,然后这个方法还可以有自己的属性,这是多么不可想象的):

    var myFunction = function func(name,age){
        this.name = name;
        this.age = age;
    }

    我以为我的真的给这个函数对象添加了name和age属性,但是实际上你要这样做:

    var myFunction = function func(){
    }
    myFunction.name = 'myFunction';
    myFunction.age = 19;
    console.log(myFunction.name);
    console.log(myFunction.age);

    这时候你就会发现它跟你创建的其他普通对象是不一样的,比如:

    var MyObject = function func(){
        this.name = 'name';
        this.age = 20
    }
    var my = new MyObject()
    console.log(my.age);

    你会想怎么这种对象会这么奇特,不是跟function对象添加属性是一样的

    Function.method('new', function ( ) {
    // Create a new object that inherits from the
    // constructor's prototype.
        var that = Object.create(this.prototype);
    // Invoke the constructor, binding –this- to
    // the new object.
        var other = this.apply(that, arguments);
    // If its return value isn't an object,
    // substitute the new object.
        return (typeof other === 'object' && other) || that;
    });

    原因就是new这个操作符所做的操作跟上面这个函数是一样的

    所以现在function对象跟其他的object对象就应该统一在一起了:

    var myFunction = function func(){
    }
    myFunction.name = 'name';
    myFunction.age = 29
    myFunction.get_age = function(){
        console.log(this.age);
    }
    myFunction.get_age();

     函数还有一个特点就是他是可以被调用的,它被调用的时候this是根据上下文指向不同的对象

  • 相关阅读:
    Red5/FMS视频直播带宽计算
    基于NPOI开源框架写的ExcelHelper
    Using C# 4.0 and dynamic to parse JSON
    跟我学MVVM模式开发
    supermap使用代码示例(GIS)
    使用OpenXML将Excel内容读取到DataTable中
    ADO 数据类型转换表
    I don't like Regex...
    将Datatable转Excel少于4笔时汉字乱码4/26
    记录宝宝成长脚印3/31
  • 原文地址:https://www.cnblogs.com/ghgyj/p/4006235.html
Copyright © 2011-2022 走看看