【发布时间】:2014-12-30 21:34:07
【问题描述】:
我正在编写一个 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 方法克隆的新对象?
答案是 here - 取决于对象的创建方式 - 请参阅下面的评论
【问题讨论】:
-
那是不可能的,但我什至看不到您的代码将
writable属性设置为false的位置? -
据此,可写属性/属性描述符默认设置为 FALSE developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
-
不,只有当你有一个属性描述符并省略一个属性时,当属性描述符对象用于创建属性时,那个属性将默认为
false。但是在已经存在的属性中没有任何改变,在通过简单赋值创建的属性中,所有属性默认为true。 -
是的,部分正确-想知道'default = false'如何,但在新对象上它大多看起来是“true”-答案是它取决于对象属性的定义方式-所以如果一个对象被定义为
myObject={}; myObject.a=1;所有默认为true,但定义为Object.defineProperty(myObject, 'a', { value: 1 });任何未定义的描述符默认为false。比较混乱。见developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… -
是的,我就是这么说的 :-)
标签: javascript angularjs object properties defineproperty