}
注意:只有在加了 this 的时候才是调用类的成员变量,否则只是函数内的一个局部变量而已。要分清楚有没有 this 的时候变量的作用范围。
第二种方法就是在构造函数或者任何成员函数外部声明,其格式是 <类名>.prototype.<变量名>:
javascript
function foo() {
//…
}
foo.prototype.hello = “world”;
无论上面哪种方法都是对成员变量的声明,我们可以看看效果:
javascript
var bar = new foo();
console.log(bar.hello);
甚至你可以这么修改这个类:
javascript
function foo() {
this.hello = “world”;
}
foo.prototype.hello = “蛋花汤”;
然后再用上面的代码输出。
想想看为什么输出的还是 world 而不是 蛋花汤。
构造函数
我们之前说过了这个 foo() 实际上是一个 构造函数。那么显然我们可以给构造函数传参数,所以就有了下面的代码:
javascript
// 代码2.1
function foo(hello) {
if(hello === undefined) {
this.hello = “world”;
} else {
this.hello = hello;
}
}
我们看到上面有一个奇葩的判断 if(hello === undefined),这个判断有什么用呢?第一种可能,就是开发者很蛋疼地特意传进去一个 undefined 进去,这个时候它是 undefined 无可厚非。
还有一种情况。我们一开始就说了 JavaScript 是一门弱类型语言,其实不仅仅是弱类型,它的传参数也非常不严谨。你可以多传或者少传(只要保证你多传或者少传的时候可以保证程序不出错,或者逻辑不出错),原则上都是可以的。多传的参数会被自动忽略,而少传的参数会以 undefined 补足。
看看下面的代码就明白了:
javascript
// 上接代码2.1
var bar1 = new foo();
var bar2 = new foo(“蛋花汤”);
请自行输出一下两个 bar 的 hello 变量,会发现一个是 world 一个是 蛋花汤。显而易见,我们的第一个 bar1 在声明的时候,被 Node.js 自动看成了:
javascript
var bar1 = new foo(undefined);
所以就有了它是 world 一说。
还有就是在这个构造函数中,我们看到了传进去的参数是 hello 而这个类中本来就有个成员变量就是 this.hello。不过我们之前说过了有 this 和没 this 的时候作用域不同,那个参数只是作用于构造函数中,而加了 this 的那个则是成员变量。用一个 this 就马上区分开来他们了,所以即使同名也没关系。
成员函数









