我正在编写一个 AngularJS 服务提供者(函数):
- 从 SQLite 数据库的多个不同表中获取结果
- 将对象返回给各种控制器函数
该服务查询不同的表(具有不同的列),因此result
对象具有不同的属性 - 取决于数据来自哪个表。
- 因此无法
Object.defineProperties
用于特定的对象属性,因为在创建查询“案例”之前我不知道属性 - 我想我可以在“开关”中定义对象变量属性,但这看起来很乱......
当对象返回到控制器函数时,需要进行一些操作
- 我需要能够覆盖返回对象中的一些属性(即需要
writable: true
) - 准确地说, JSON.parse() 然后覆盖各种属性,因为存储在 SQLite DB 中的数组在 INSERT 之前用 JSON.stringify() 转换,然后作为字符串存储在 DB 中
- 我遇到了麻烦,因为对象的默认值是
writable: false
问题:
我如何定义一个对象以具有对象configurable: true, writable: true, enumerable: true
的所有(未来)属性的属性? 即如何设置对象的默认属性,因为我(还)不知道对象的确切属性名称?
示例代码:
this.checkRowExists = function(table, id) {
try {
var deferred = $q.defer();
switch (table) {
case "table1" :
var selectQuery = 'SELECT * FROM ' + table + ' WHERE id=?';
break;
case "table2" :
var selectQuery = 'SELECT * FROM ' + table + ' WHERE id=?';
break;
case "table3" :
var selectQuery = 'SELECT * FROM ' + table + ' WHERE id=?';
break;
}
this.db.transaction(function(tx) {
tx.executeSql(selectQuery, [id], function(tx, results) {
if (results.rows.length > 0){
var myRow = {}; // <- how to define all properties in "myRow" object as configurable and writable ??
var myRow = results.rows.item(0);
deferred.resolve(myRow); // <- object "myRow" is returned here to various controller functions
} else {
deferred.resolve(results.rows.length);
}
}, function(tx, error) {
console.log('checkRowExists: Error occurred while searching for profile.', error);
deferred.reject(error);
});
});
return deferred.promise;
} catch(exception) {
console.log('checkRowExists: Error occurred while trying this function.', exception);
}
};
PS代码工作正常,但只返回一个对象,writable: false, enumerable: true, configurable: false
而我需要一切true
编辑:
即使在下面的部分解决方案之后仍然存在问题:
- 为什么不能使用该Object.defineProperty
方法手动更改属性描述符?
- 为什么enumerable: true
默认值应该是 false ?这与 SQlite 数据库事务有关吗?
- 为什么默认值writable: false, enumerable: false, configurable: false
不应用于使用 JSON 方法克隆的新对象?
答案在这里- 取决于对象的创建方式 - 请参阅下面的评论