骨干类属性? 'this.property'不适用于它的方法吗?

时间:2016-06-03 06:39:51

标签: javascript backbone.js web

需要帮助Backbone:

var Vehicles = Backbone.Model.extend({}, {
    name: 'Sabre',
    summary: function() {
        console.log(this.name +" is a dog!");
    }
});

Vehicles.summary();

这打印出来:“是一只狗”

两个问题:

  1. 为什么不打印出这个名字?为什么 this.name 不起作用?

  2. 在以下一行中, firstBlock secondBlock 之间有什么区别?

    Backbone.Model.extend({firstBlock},{SecondBlock});
    

2 个答案:

答案 0 :(得分:4)

如果您在this静态方法中查看summary

summary: function() {
    console.log(this);
}
你会看到这样的东西:

function (){return r.apply(this,arguments)}

所以this确实是你期望它的构造函数。这意味着this不是问题。

当你说M = Backbone.Model.extend(...)时,你会在M中得到一个构造函数。但是,JavaScript函数具有不可写name properties

  

<强> Function.name

     

function.name属性返回函数的名称。

所以问题是你试图使用name作为静态属性,但是已经采用了属性名称而你无法覆盖它。

如果您使用其他属性名称:

var Vehicles = Backbone.Model.extend({}, {
    pancakes: 'Sabre',
    summary: function() {
        console.log(this.pancakes + " is a dog!");
    }
});

然后事情将按预期运行,因为函数(通常)没有不可写的pancakes属性。

演示:https://jsfiddle.net/ambiguous/qk78edkp/

就你的第一个问题而言,它确实有效,但Backbone.Model.extend给你的构造函数没有名字。

Pimmol's answer很好地涵盖了第二个问题,所以我将单独留下。

答案 1 :(得分:2)

来自annotated sourcetry (final AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext()) { ctx.registerBeanDefinition("selectedProducts", BeanDefinitionBuilder .rootBeanDefinition(ProductHandle.class, "create") .addConstructorArgValue(mySelectedProduct) .getBeanDefinition()); ctx.registerBeanDefinition("allProducts", BeanDefinitionBuilder .rootBeanDefinition(Lists.class, "asList") .addConstructorArgValue(allMyProducts) .getBeanDefinition()); ctx.refresh(); final MyApp app = ctx.getBean(MyApp.class); app.run(); }

阅读文档可能有点令人困惑: http://backbonejs.org/#Model-extend

  

Backbone.Model.extend(properties,[classProperties])

但它意味着相同:)

输出“是狗”的原因是因为var extend = function(protoProps, staticProps[..]namesummary模型的静态属性。因此,Vehicles无法在静态this方法中使用,因为它不是您要引用的实例。您可以在不创建实例的情况下访问这些属性。

所以这会奏效:

summary

扩展中的第一个参数是var Vehicles = Backbone.Model.extend({}, { foo: 'Sabre', staticMethod: function () { console.log(Vehicles.foo + " is a dog!"); } }); Vehicles.staticMethod(); ,如注释源中所示。因此,如果要使用这些属性,则必须创建新实例

protoProps

当然,你可以将这两者结合起来:

var Vehicles = Backbone.Model.extend({
    name: 'Sabre',
    summary: function() {
        console.log(this.name + ' is a dog');
    }
});

var v = new Vehicles();
v.summary();