javascript – 为什么instanceof关键字不适用于Backbone js模型?

我正在构建一个涉及继承和使用instanceof javascript关键字的Backbone JS应用程序.

我有以下代码

app.Sport = Backbone.Model.extend
({
    defaults:
    {
        id: 0,title: 'Running'
    }
});

代码中,我输入以下内容来实例化一个新的Sport:

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);

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...