search

Home  >  Q&A  >  body text

javascript - 请问js中给function添加的属性去哪儿了?有什么用途?

请问下,因为Function是引用类型,那么就可以给他添加自定义的属性,可是添加的这个属性有什么用途呢?

javascriptvar sfFunc = function(){};
sfFunc.ename = 'segmentfault';
PHP中文网PHP中文网2820 days ago397

reply all(7)I'll reply

  • PHP中文网

    PHP中文网2017-04-10 15:12:52

    在javascript中,函数被认为是第一类对象,即函数可以被传递或者可以携带属性或方法。

    在函数中使用this,添加的方法,可以被认为是为其添加了私有方法:
    (你举例用了对象字面量创建函数,在添加属性这方面跟直接声明函数一致)

    function Bar(){
        this.foo = 123;
    }
    
    var temp = Bar;
    temp.foo   // undefined    这样是访问不到的,虽然temp指向了Bar的引用
    
    var bar = new Bar();
    bar.foo    // 123       因为bar是Bar的实例,所以可以理解为bar将Bar里的私有属性和方法都克隆到自己的身上,并且克隆过来的属性和方法和被克隆体(Bar)脱离干系。
    

    私有化属性和方法的作用是保护属性或方法不被随意重写/覆盖:

    function Blog(){
        this.title = 'blue sky';
    }
    
    var bar = new Blog();
    bar.title      // 'blue sky'
    
    var foo = Blog;
    foo.title = 'green sky'    // 试图改写title属性
    foo.title   //   'green sky'    
    bar.title   //   'blue sky'    依旧是原来的值
    

    那么这样有什么用呢?

    最常见到的应该就是初始化对象了:

    function People(name,age){
        this.name = name;
        this.age = age;
    }
    
    var boy = new People('qianjiahao',22);
    boy.name   // qianjiahao
    boy.age    // 22
    

    它可以像工厂一样按一个模子,给你制造任意多的固定格式的对象,但是缺陷也很明显,格式太固定,如果想变变花样还不行,这时,就可以配合原型,来制造任意多的期望对象(模拟设计模式:继承)

    reply
    0
  • 怪我咯

    怪我咯2017-04-10 15:12:52

    有这个语法,有什么用就看你发挥了,比如jQuery的某些全局的函数就是放在 $或是jQuery中的

    另,函数的的.name是只读的

    reply
    0
  • ringa_lee

    ringa_lee2017-04-10 15:12:52

    var aa = function(){}
    
    var bb = new aa();
    
    bb.name = "cc";
    
    console.log(bb.name)  //"cc"
    

    我一直是这么用的,具体含义不太能说明,应该是继承的关系,求大神来说明

    reply
    0
  • 天蓬老师

    天蓬老师2017-04-10 15:12:52

    类似 Java 里的静态属性,可以不用生成实例而直接获取属性值,类似 Math.PI, Math.E

    reply
    0
  • 高洛峰

    高洛峰2017-04-10 15:12:52

    这是JavaScript中静态属性和实例属性相关的知识,不造轮子了,找了个链接:http://www.jb51.net/article/20236.htm

    reply
    0
  • 天蓬老师

    天蓬老师2017-04-10 15:12:52

    不建议动态添加属性吧

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 15:12:52

    http://yanhaijing.com/javascript/2014/05/15/a-code-explain-javascript-...
    可设置公用静态属性和方法

    reply
    0
  • Cancelreply