Js面向对象学习之function
js中的函数有三种表示方式:
//函数的第一种表示方式:函数关键字的方式 function f1() { alert("f1"); } //函数的第二种表示方式:函数字面量的方式 var f2 = function() { alert("f2"); } //函数的第三种表示方式:构造函数的方式 var f3 = new Function('var a = 100; b = 200; return a+b;'); alert(f3());
函数的定义方式一般有以上三种,前两种方式基本没什么区别,第三种定义方式(Function()构造函数)每次执行时都解析函数主体,并创建一个新的函数对象。所以当在一个循环或者频繁执行的函数中调用Function()构造函数的效率是非常低的。相反,函数字面量却不是每次遇到都重新编译的。一般不会采用第三种方式。
另外,分别执行alert(f1.constructor); alert(f2.constructor); alert(f3.constructor);都会出现同样的效果,如下:
f1.constructor,f2.constructor,f3.constructor都是一个对象,为Function,这里可以这样理解,这三个函数f1,f2,f3都是通过Function的形式产生的,所以他们的构造器就是Function,由此也可以推出这三种函数的产生方式其实内部原理是一样的。
在JavaScript中,每个具有原型的对象都会自动获得constructor属性。对象的constructor属性用于返回创建该对象的函数,也就是我们常说的构造函数。实际上,在js中,每一个function都是一个Function Object。
总结:1、在js中一切皆对象;2、在js中对象有一个属性为constructor;3、在js中,凡是函数都是构造器对象
另外,从面向对象的角度来理解,上面实例中f1是一个函数,同时它也是一个对象,constructor可以理解为它的一个属性,并且这里可以利用该对象的constructor属性找到它的构造函数。
可以为f1这个对象动态的添加属性:
//给f1对象添加一个属性为b,值为5 f1.b = 5; alert(f1.b); //给f1对象添加一个属性为bb,bb为对象,值为var f2 = function() { alert("f2");} f1.bb = f2; alert(f1.bb);
在js中,任何一个对象都有可能成为另一个对象的属性。
一个对象可以动态的添加任何一个属性,但是这个对象必须有值,不能是null和undefined。
function Person() { //do something } function P() { //do something } function A() { //do something } function B() { //do something } Person.a = P; Person.a.b = A; Person.a.b.c = B; Person.a.b.c.d = f2; alert(Person.a.b.c.d); //正确,因为Person.a.b.c是有值的 alert(Person.a.b.c.d.e.f); //错误,不能为Person.a.b.c.d.e增加属性f,因为Person.a.b.c.d.e是undefined