Page 200 - 你不知道的JavaScript(上卷)
P. 200
return x;
},
baz: function baz(x) {
if(x < 10){
return baz( x * 2 );
}
return x;
}
};
在本例中使用 Foo.bar(x*2) 就足够了,但是在许多情况下无法使用这种方法,比如多个对
象通过代理共享函数、使用 this 绑定,等等。这种情况下最好的办法就是使用函数对象的
name 标识符来进行真正的自我引用。
使用简洁方法时一定要小心这一点。如果你需要自我引用的话,那最好使用传统的具名函
数表达式来定义对应的函数( · baz: function baz(){..}· ),不要使用简洁方法。
6.5 内省
如果你写过许多面向类的程序(无论是使用 JavaScript 还是其他语言),那你可能很熟悉自
省。自省就是检查实例的类型。类实例的自省主要目的是通过创建方式来判断对象的结构
和功能。
下面的代码使用 instanceof(参见第 5 章)来推测对象 a1 的功能:
function Foo() {
// ...
}
Foo.prototype.something = function(){
// ...
}
var a1 = new Foo();
// 之后
if (a1 instanceof Foo) {
a1.something();
}
因 为 Foo.prototype( 不 是 Foo !) 在 a1 的 [[Prototype]] 链 上( 参 见 第 5 章 ), 所 以
instanceof 操作(会令人困惑地)告诉我们 a1 是 Foo“类”的一个实例。知道了这点后,
我们就可以认为 a1 有 Foo“类”描述的功能。
当 然,Foo 类 并 不 存 在, 只 有 一 个 普 通 的 函 数 Foo, 它 引 用 了 a1 委 托 的 对 象(Foo.
prototype)。从语法角度来说,instanceof 似乎是检查 a1 和 Foo 的关系,但是实际上它想
说的是 a1 和 Foo.prototype(引用的对象)是互相关联的。
行为委托 | 185