JS的面向对象编程
1.1 对象
顾名思义,面向对象编程与对象有关。到目前为止,我们一直将对象当做值的无规律组合,在认为合适的时候添加和改变对象的属性。在面向对象的方法中,每个对象都是一个包含自身的小世界,外界只能通过有限明确的接口来接触对象,这些接口由一些具体的方法和属性组成。
之前见到的Date和Error对象的工作原理就是这样。它们用New关键字创建对象的方法,并提供多种方法和属性为其余的接口,而不是提供正规函数来使用这些对象。
1.1.1 定义方法
为对象添加方法的一种方式就是简单的附加一个函数值,如下面的代码所示。
var rabbit={}; rabbit.speak=function(line){ print("The rabbit say '"+line+"'"); }; rabbit.speak("I am alive");
在大多数情况下,方法也需要明确调用自己的对象。例如,如果有多只兔子,speak方法要指出哪只兔子在说话。可以通过一个特殊的变量this来达到这个目的。当将函数作为方法调用(查找属性,然后立即调用,比如object.method() )时,this将指向相关的对象。
function speak(line) { print("The ", this.adjective, " rabbit say '", line, "'"); }; whiteRabbit = { adjective: "white", speak: speak }; fatRabbit = { adjective: "fat", speak: speak }; whiteRabbit.speak("Oh my ears and whiskers,how late it is getting!"); fatRabbit.speak("I could sure user a carrot right now.");
上面的代码使用this变量将正在说话的兔子的类型插入输出文本中。其将输出一下类容:
The white rabbit say Oh my ears and whiskers,how late it is getting!
The fat rabbit say I could sure user a carrot right now.
现在可以弄清apply方法的第一个神秘参数了,该参数指向调用该方法的对象,也可以通过以下方式让rabbit调用speak方法:
speak.apply(fatRabbit,["Yum."]);
函数也有一个与apply类似的call方法,但是可以为函数分别给出相应的参数,而无需将其作为一个数组。
speak.call(fatRabbit,"Burp.");
对于多个参数,可以按如下方式使用call和apply:
function run(from, to) { print("The ", this.adjective, "rabbit runs from ", from, " to ", to, "."); }; run.apply(whiteRabbit, ["A", "B"]); run.call(fatRabbit, "A", "B");
1.1.2 构造函数
new 关键字提供了一种简便的新对象创建方式。如果调用函数时在前面加new修饰符,其this变量将指向一个新对象,该对象会自动返回(除非使用return语句返回特定值)。以这种方式创建对象的函数称为构造函数。以下是创建兔子对象的构造函数。