Crockfordをモデルにした Javascript クラス用の単純な寄生インターフェイスを開発しようとしており、いくつかの基本的な内省的メソッドを実装したいと考えています。以下のクラスが与えられた場合、オブジェクト クラスを正しく識別するメソッドを作成するclass_name
にはどうすればよいでしょうか?is_a
function Parent(name) {
var self = {};
self.name = name;
self.init = function() {
console.debug('init', self);
return self;
};
self.ama = function() {
return "AMA Parent named " + self.name;
};
// Introspective methods
self.class_name = function() {
// returns class name as a string
};
self.is_a = function(obj_class) {
// returns boolean indicating whether object is instance of obj_class
};
self = self.init();
return self;
}
function Child(name) {
var self = new Parent(name);
var base_ama = self.ama;
self.ama = function() {
var ama = base_ama();
return ama + ". NOT!";
};
self.init();
return self;
}
合格することが期待されるテストは次のとおりです。
var alice = new Parent('Alice');
assert_equal(alice.name, 'Alice');
assert_equal(alice.class_name(), 'Parent');
assert(alice.is_a(Parent));
assert_not(alice.is_a(Child));
assert_equal(alice.ama(), 'AMA Parent named Alice');
var bob = new Child('Bob');
assert_equal(bob.class_name(), 'Child');
assert_not(bob.is_a(Parent));
assert(bob.is_a(Child));
assert_equal(bob.ama(), 'AMA Parent named Bob. NOT!');
テストがセットアップされたフィドルをここで見つけることができます: