Javascript 可能不会在语言本身中指定属性的顺序,但至少在我的项目(也许还有你的项目)中,它确实表现得好像确实如此(JSON.stringify,调试监视窗口等)。除了最初添加属性的顺序之外,我从未见过for...in 顺序。因此,就我项目的所有意图和目的而言,也许还有你的项目,这是非常可预测的。
虽然这不会影响执行,但如果您想看到一个统一的列表,当不同项目的属性可能以不同的顺序添加时,这会很痛苦,具体取决于对象的创建方式。执行可能不是项目开发中唯一重要的事情。快速目视检查对象的能力也可能很重要。
方法一(高科技)
如果你有spread,如果你不介意另一个对象,我会使用它。但如果您没有spread(就像在旧的 google 应用程序脚本中一样),或者您需要保留原始对象,您可以这样做:
objects.js
// Insert Property
Object.defineProperty(
Object.prototype,
'insertProperty',
{
value: function(name, value, index){
// backup my properties
var backup = {};
// delete all properties after index
var propertyIndex = 0;
for(var propertyName in this) {
if(this.hasOwnProperty(propertyName) && propertyIndex++ >= index) {
backup[propertyName] = this[propertyName];
delete this[propertyName];
}
}
this[name] = value;
// restore all properties after index
for(var propertyName in backup) {
if(backup.hasOwnProperty(propertyName))
this[propertyName] = backup[propertyName];
}
return this; // same object; not a new object
},
enumerable: false,
});
用法
var obj = {'b': 2, 'c': 3};
obj.insertProperty('a',1,0); // {a:1, b:2, c:3}
笔记
- 您可以使用任何
index 将属性放在您想要的任何位置。 0 放在前面。
- 如果您不喜欢向
object prototype 添加方法,您当然可以将函数拉出并添加一个obj 参数。在我的项目中,向原型添加方法对我有帮助;它不会伤害我。
方法 2(低技术)
在某些情况下,您可以只使用您知道它最终可能具有的所有属性以您希望它们出现的顺序创建您的对象,然后,而不是插入属性,只需设置属性。
// creation
var a = {Id: null, foo: 'bar'};
// update later
if(!a.Id)
a.Id = '123';