随身笔记
随身笔记

请问js中给function添加的属性去哪儿了?有什么用途?,在js中为什么说函数也是对象?

函数是对象

在js中为什么说函数也是对象?

我们都知道js中的对象要调用里面的属性和方法一般的写法都是:

obj,name;  
obj.run();

这样很正常,但是function也能这么写,例如:

function wo(){}  //声明了一个函数

wo.name='我';
wo.run=function(){ return '这是一个方法'; }

调用方法跟调用对象一样:
obj.name; 
obj.run();

 

其实这么写的作用,就要联想到js的面向对象思想了,一般我们写一个构造函数的写法是:

function Wo(){
 this.myname='我1'; //这里的this其实也就是Wo本身,并且还是私有的,外界无法访问,也不能修改,同时也是起到了初始化的作用。
 this.run=function(){ }
}

alert( Wo.myname ); //试图访问 myname 返回的是 undefined

Wo.myname='我2'; //试图修改 this.myname的值

alert( Wo.myname ); //修改失败,因为不能访问,这里访问到的是外界的 我2

 

 

 

引入一篇文章:《请问js中给function添加的属性去哪儿了?有什么用途?

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

var sfFunc = function(){};
sfFunc.ename = 'segmentfault';

 

 

 

在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

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

 

 

 

 

没有标签
首页      前端资源      JavaScript笔记      请问js中给function添加的属性去哪儿了?有什么用途?,在js中为什么说函数也是对象?

随身笔记

请问js中给function添加的属性去哪儿了?有什么用途?,在js中为什么说函数也是对象?
函数是对象 在js中为什么说函数也是对象? 我们都知道js中的对象要调用里面的属性和方法一般的写法都是: obj,name;   obj.run(); 这样很正常,但是function也能这么写,例如: …
扫描二维码继续阅读
2016-02-21