不确定这是一个错误还是对事情如何起作用的误解:
使用parse-js-sdk 1.9.2和angular 1.4.8
//comment out the following line and it works ok
Parse.Object.disableSingleInstance();
var parseObjClass = Parse.Object.extend('Comments', {
// Instance methods
initialize: function (attrs, options) {}
},
{});
['name', 'desc'].forEach(function (item) {
Object.defineProperty(parseObjClass.prototype, item, {
get: function () {
return this.get(item);
},
set: function (aValue) {
return this.set(item, aValue);
}
});
});
var parseObj = new parseObjClass();
parseObj.name = 'Hello World'
parseObj.desc = 'Test Object'
console.log('original is ' + JSON.stringify(parseObj));
//--> original is {"name":"Hello World","desc":"Test Object"}
var objCopy = angular.copy(parseObj);
console.log('copy is ' + JSON.stringify(objCopy));
//--> copy is {}
这是一个说明https://plnkr.co/edit/UjWe9dl6D6Qkx9ihBSMC
的傻瓜后台:我们正在使用disableSingleInstance模式,因为我们有一个移动应用程序和一个可以与相同数据库行交互的Web应用程序(时间表数据),并且js-sdk遇到问题并不总是拥有最新版本的数据...
答案 0 :(得分:3)
根据angular.copy(source, [destination]);
docs:
仅考虑可枚举的属性。不可枚举的属性(
source
和destination
)将被忽略。
根据MDN docs for Object.defineProperty(obj, prop, descriptor)
:
默认情况下定义类似的属性时,它不可枚举。因此,您必须在enumerable: true
上指定descriptor
。
例如:
Object.defineProperty(parseObjClass.prototype, item, {
enumerable: true,
get: function () {
return this.get(item);
},
set: function (aValue) {
return this.set(item, aValue);
}
});
<强>更新强>
刚刚意识到您的setter
存在问题,getter
使用它的方式会阻止您的财产成为可枚举的。
你可以删除get和set并替换为writable,它应该没问题。
Object.defineProperty(parseObjClass.prototype, item, {
enumerable: true,
writable: true
});
如果您需要使用get
和set
,则必须使用私有var或其他内容,例如get: () => _props[item];