在对象中引用Javascript对象的正确方式
Right way of referencing Javascript Objects inside Objects
我是JavaScript的新手,我对我的应用程序中使用的以下遗留淘汰和JS代码不太确定:
file1.js:
var FbPicturesObj = {
fbPicturesVM: new FbPicturesVM(),
initialize: function () {
ko.applyBindings(FbPicturesObj.fbPicturesVM, $("#fb-albums")[0]);
ko.applyBindings(FbPicturesObj.fbPicturesVM, $("#fb-album-photos")[0]);
},
Reset: function Reset() {
FbPicturesObj.fbPicturesVM.albums([]);
FbPicturesObj.fbPicturesVM.photos([]);
}
}
file2.js:
function FbPicturesVM() {
...... some code ....
}
我的问题是:
- 是否每次调用
FbPicturesObj.fbPicturesVM
都会在内存中创建一个fbPicturesVM的新实例 ko.applyBindings
调用是否正确写入?(在代码优化方面)
非常感谢。
File1.js
包含JavaScript对象的定义,更确切地说是一个";文字对象创建";。
在它内部,每个propertyName: value
对声明一个初始化一个新属性,这样在创建对象时代码只运行一次。例如fbPicturesVM: new FbPicturesVM()
JavaScript对象的属性可以是函数,例如:initialize: function () {...},
。在这种情况下,无论何时运行FbPicturesObj .initialize
,都会运行此函数。
对ko.applyBindings
的调用是正确的。此方法需要viewmodel对象和可选的DOM元素作为第二个参数。jQuery表达式(不完全是)所选DOM元素的数组,因此此$("#fb-album-photos")[0]
根据ko.applyBindings
的需要提取jQuery表达式的第一个DOM元素。
注意:正如您所怀疑的,定义模型的方式至少不是最好的。您可以使用显示模块模式,这使事情变得更加容易
显示模块模式
简而言之:
var vm = (function() { // declare a function
// create variables and functions
var name = ko.observable();
var age = ko.observable();
var _privateVar = 'Yuhu'; // won't be revealed
var incAge = function() {
age = age + 1;
};
// reveal only what you want, by returning it in an object
return {
name: name,
age: age,
incAge: incAge
// note that _privateVar is not exposed, but could be
}
})(); // This invokes the function, so that it return the model
注意模式"立即调用函数表达式"(IIFE)。
var value = (function() {/*return something*/})();
这个模式定义了一个匿名函数,它返回一些东西。最后的()
运行它,从而返回值,并存储在value
中;
我推荐这种模式,因为它非常容易使用,而且很少出错。经典的原型继承、构造函数和诸如此类的东西都很难处理。
您可以在视图模型工厂(类似于构造函数,但实际上不是js构造函数)中轻松地转换它,方法是删除调用-末尾的()
-并存储函数定义,这样您就可以重复调用它。
var factory = function() {/*return something*/};
var vm1 = factory();
var vm2 = factory();
FbPicturesVM
的构造函数仅在实例化FbPicturesObj
对象时调用(在您的示例中,这将仅在脚本包含在页面中时调用)。因此,就内存而言,您只有一个实例,然后将引用传递给它(JS主要通过引用传递对象)。
我不太了解敲除,但语法上并没有错,传递一个对象和一个元素听起来对绑定代码来说是正确的。
这个问题应该分开,因为第一个问题与Knockout无关,更多的是关于对象文字如何与实例化对象相关联。
因此,对于问题1,答案是"否",因为FbPicturesObj保存实例化的属性FbPictures.fbPicturesVM
考虑以下内容:
var Person = function(name) {
this.name = name
}
Person.prototype.sayName = function() {
return this.name
}
var people = {
fred : new Person('fred')
}
console.log(people.fred.sayName()); // returns 'Fred'
var people = {
fred : new Person('jane')
}
console.log(people.fred.sayName()) // returns 'jane' and not 'fred'
var people = {
fred : new Person('fred'),
jane : new Person('jane')
}
console.log(people.fred.sayName()) // returns 'fred'
console.log(people.jane.sayName()) // returns 'jane'
在这种情况下,每次调用"person.fred"都将始终引用同一个实例,因为它已保存到people对象中。
- Rails将JavaScript对象存储到Model的有效方式
- 别名或以其他方式合并两个具有不同名称的相同对象原型
- 如何以编程方式添加到可变嵌套对象中
- 以非ajax方式将js对象传递给mvc操作
- 解析以下对象的最佳方式
- 以编程方式将fabric-js-canvas的图像替换为hq图像,并重新计算其他对象的坐标和大小
- Javascript.连接两组对象的最佳方式,如SQL
- 以有效的方式搜索对象列表 mongo
- 有没有一种快捷方式可以让我用javascript或jQuery设置对象的字段
- Angular:将对象存储在服务中以在视图中显示和将crud函数存储到服务器的最佳方式是什么
- 用JavaScript编写对象方法的最佳方式是什么
- 我可以在Node中以编程方式更改.js文件的module.exports中的JSON对象吗
- 连接与数组对象相关的文本:方式和位置
- 迭代JSON对象并将元素打印到屏幕上的最佳方式是什么
- React是装载前处理空对象的最佳方式
- 对对象数组进行分组和排序的最佳方式
- Javascript:以编程方式对对象数组进行排序
- 将特性插入到角度控制器中阵列中的对象中的最佳方式
- 创建javascript对象的最佳方式
- 什么'It是声明对象的最佳方式