需要帮助Backbone:
var Vehicles = Backbone.Model.extend({}, {
name: 'Sabre',
summary: function() {
console.log(this.name +" is a dog!");
}
});
Vehicles.summary();
这打印出来:“是一只狗”
两个问题:
为什么不打印出这个名字?为什么 this.name 不起作用?
在以下一行中, firstBlock 和 secondBlock 之间有什么区别?
Backbone.Model.extend({firstBlock},{SecondBlock});
答案 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 source:
try (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[..]
和name
是summary
模型的静态属性。因此,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();