我正在构建一个涉及继承和使用instanceof
javascript关键字的Backbone JS应用程序.
我有以下代码:
app.Sport = Backbone.Model.extend ({ defaults: { id: 0,title: 'Running' } });
var newSport = new app.Sport ();
我可以毫无问题地操纵这个新创建的实例.
但是,因为有一个但是,当询问我的实例类型时,instanceof关键字总是返回false:
console.log ('is newSport a Sport instance ? ' + newSport instanceof app.Sport);
注意:我没有在我的问题中提到继承,因为它甚至不能使用简单形式的OOP(基类的一个实例,并在之后询问类型).
我最初的目的是根据运动的类型触发特定的动作(因此使用instanceof关键字);它可能是一个很酷的,或者是一个极端的:
app.CoolSport = app.Sport.extend ({ ... }); app.ExtremeSport = app.Sport.extend ({ ... });
编辑:我隔离了这个问题.它没有链接到instanceof关键字或我声明的Model.相反,我填充了Backbone集合,并推动了一些不同类型的运动.这是测试代码:(Fiddle)
var app = {}; app.Sport = Backbone.Model.extend ({ defaults: { id: 0,title: 'Running' } }); app.CoolSport = app.Sport.extend ({ defaults: { uselessAttr:'I am a Cool Sport !' } }); app.SportList = Backbone.Collection.extend ({ model: app.Sport }); var coolSport1 = new app.CoolSport(); console.log ('is coolSport1 a Sport instance ? ',coolSport1 instanceof app.Sport); console.log ('is coolSport1 a CoolSport instance ? ',coolSport1 instanceof app.CoolSport); console.log ('is coolSport1 a CoolSport instance (wrong operand in console) ? ' + coolSport1 instanceof app.CoolSport); var sportList = new app.SportList(); sportList.push (coolSport1.toJSON()); sportList.each ( function ( sport ) { if ( sport instanceof app.CoolSport ) { console.log ( "sport is an instance of Cool Sport ! Yeah !",sport instanceof app.CoolSport ) ; } else { console.log ( "Not a CoolSport instance.."); } });
你猜怎么着 ?我的CoolSport实例……不是CoolSport实例.我怀疑Backbone SportList集合的初始化是个问题.
有任何想法吗 ?
解决方法
请不要这样:
console.log ('is newSport a Sport instance ? ' + newSport instanceof app.Sport);
做对了:
console.log ('is newSport a Sport instance ? ' + (newSport instanceof app.Sport));
要么
console.log ('is newSport a Sport instance ? ',newSport instanceof app.Sport);