- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我知道这是 javascript 本身的问题(或行为),而不是 Backbone 的扩展方法,但我想知道避免它的最佳策略是什么。
让我们更好地把它放在代码中:
var MyModel = Backbone.Model.extend({
value: 0,
values: []
});
var myFirstModel = new MyModel();
myFirstModel.value // 0, as expected
myFirstModel.values // [], as expected
var mySecondModel = new MyModel();
mySecondModel.value = 2;
mySecondModel.values.push(2)
mySecondModel.value // 2, as expected
mySecondModel.values // [2], as expected
myFirstModel.value // 0, as expected
myFirstModel.values // [2], ... WAT!!!
我明白问题是我没有为 mySecondModel.values 分配新值我只是对原型(prototype)中的值变量进行操作,即 MyModel.prototype.values(与任何其他相同的问题当然是对象)
但这很容易搞砸。最直观的做法是将它们视为实例变量,而不是每个实例共有的变量(基于类的语言中的静态或类变量)。
到目前为止,我找到的一般解决方案是在初始化方法中初始化每个变量,如下所示:
var MyModel = Backbone.Model.extend({
initialize: function() {
this.value = 0;
this.values = [];
}
});
这样一切都按预期工作,即使对于简单值(如 this.value)来说不是必需的,我发现在任何情况下都坚持这个原则要容易得多。
我想知道是否有更好(更优雅、更清晰)的解决方案来解决这个问题
最佳答案
这是 JavaScript 的原型(prototype)继承和 Array
对象是引用类型这一事实的结果。您传递给 extend
的对象的键/值对被复制到 MyModel
的原型(prototype)上,因此它们将被 MyModel
的所有实例共享>。因为 values
是一个数组,所以当您修改它时,您修改了每个实例的数组。
通过在 initialize
中设置 values
所做的事情称为隐藏原型(prototype),这是解决此问题的正确方法。
也就是说,在 Backbone.Model
的情况下,如果您试图处理模型的属性,您可以使用 defaults
函数来提供这样的默认值:
var MyModel = Backbone.Model.extend({
defaults: function() {
return {
value: 0,
values: []
}
}
});
同样,这仅适用于实例的属性。
var inst = new MyModel();
// The defaults will be created for each new model,
// so this will always return a new array.
var values = inst.get('values');
对于您正在做的事情,在模型本身上指定属性的地方,您可以像您所做的那样在 initialize
中设置默认值。
关于javascript - Backbone : annoying behaviour of prototype object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14950479/
这个问题在这里已经有了答案: What is the rationale behind decltype behavior? (3 个答案) 关闭 5 年前。 int i = 12; decltyp
这个问题在这里已经有了答案: Undefined, unspecified and implementation-defined behavior (9 个回答) 关闭 4 年前。 C 标准 (AF
我提到了 This Question但没有答案对我有用。所以基本上我有一个 BottomNavigationView,它在向下滚动时隐藏并在向上滚动时显示。当我通过触摸滚动 Recycler View
我正在寻找一种利用mDNS,floodsub和kademlia DHT的网络行为。到目前为止,我已经使所有这些服务都可以使用,但是还不能将这些服务的响应用于有意义的事情。 理想情况下,我将能够将来自行
此代码适用于我的网站: $(function(){ $('.link-follow-stop').on('click', function(event){ console.lo
private synchronized Map calculateStanding() { System.out.println("Calculate standing for
我最近正在测试 的点击事件(点击后找到一个文本框)并发现了一些不寻常的东西。 在 HTML 标记中, 如果在里面, 上面的点击事件标签触发了两次 如果在之外,点击事件为按预期运行 为了更好地理解我要
我尝试了以下两种情况: void ssss(int b){ System.out.println ("int"+b); } void ssss(double b){ System.out.
由于截止日期的压力,我可能会忽略一些东西。但是这种行为令我惊讶。 好像游标缓存了100行,而continue语句刷新了缓存 并从获取新缓存的第一条记录开始。 我将其范围缩小到以下脚本: drop ta
我是德尔福的新手。在 TStrem 类的文档中,我读到它是一个抽象类。所以我认为当我尝试使用 创建它时编译器会出错 stream := TStream.Create(); 为什么不呢? 最佳答案 De
在 Bjarne Stroustrup 的“C++ 之旅”(第二版)的第 18 页上,他指出“对于几乎所有类型,读取或写入未初始化变量的效果是未定义的”。 我明白为什么读取未初始化的变量是未定义的行为
我正在尝试使用两个线程的代码,一个线程递增共享长变量,另一个线程递减 var。 class Shared { private long a; public void incr() {
我们都听过这样的警告:如果您在 C 或 C++ 中调用未定义的行为,任何事情都可能发生。 这是否仅限于任何运行时行为,还是还包括任何编译时行为?特别是,编译器在遇到调用未定义行为的构造时是否允许拒绝代
我在 C++ 中编写了一个简单的函数来计算具有长度、宽度和高度的 Box 对象的体积。这是一个类的一部分,所以 l,b,h是私有(private)成员: long long CalculateVolu
我对以下声明有一些疑问: SELECT 1 FROM dual WHERE DECODE(1, 0, (SELECT COUNT(*) from tbl
我正在做一项作业,要求我编写一些 unix 的 ls 代码。我遇到问题的部分是 -R 选项。 一些背景:我使用的结构包含 2 个列表,一个用于文件,另一个用于运行 ls 时作为参数传递的目录。如果除了
我正在开发一个使用 Spring 数据 的 Java Spring 项目。 它使用 repositories 在狗被主人收集时从 Kennel Object 中移除 Dog Objects。 请注意,
我有一个 NSMutableArray,我分配给它: NSMutableArray *newElements = [[NSMutableArray alloc] initWithObjects:sel
我很少使用 Python,所以我不清楚为什么允许这样的行为:没有 w 对象,因此它没有 s 属性,那为什么 f 允许进行 w.s 赋值? >>> def f(): w.s="ads" #al
我有一个网站,其中一些元素具有 position: fixed。它在桌面浏览器上看起来不错,但在我的手机(Xperia Arc,Android 2.3)上,这些元素会随着页面滚动,直到您从屏幕上松开手
我是一名优秀的程序员,十分优秀!