diff --git a/CHANGELOG.md b/CHANGELOG.md index 445b8b2ad..a9082e449 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ### master [Full Changelog](https://github.com/parse-community/Parse-SDK-JS/compare/3.1.0...master) +- Add className argument to Parse Object subclass constructor ([#1315](https://github.com/parse-community/Parse-SDK-JS/pull/1315)) ## 3.1.0 [Full Changelog](https://github.com/parse-community/Parse-SDK-JS/compare/3.0.0...3.1.0) diff --git a/integration/test/ParseSubclassTest.js b/integration/test/ParseSubclassTest.js index eafeda726..5de1e2fe8 100644 --- a/integration/test/ParseSubclassTest.js +++ b/integration/test/ParseSubclassTest.js @@ -193,4 +193,22 @@ describe('Parse Object Subclasses', () => { const wartortle = new Wartortle(); assert(wartortle.water); }); + + it('registerSubclass with unknown className', async () => { + let outerClassName = ''; + class TestObject extends Parse.Object { + constructor(className) { + super(className); + outerClassName = className; + } + } + Parse.Object.registerSubclass('TestObject', TestObject); + const o = new Parse.Object('TestObject'); + await o.save(); + const query = new Parse.Query('TestObject'); + const first = await query.first(); + expect(first instanceof TestObject).toBe(true); + expect(first.className).toBe('TestObject'); + expect(outerClassName).toBe('TestObject'); + }); }); diff --git a/src/ParseObject.js b/src/ParseObject.js index 191a57842..516a36185 100644 --- a/src/ParseObject.js +++ b/src/ParseObject.js @@ -930,10 +930,7 @@ class ParseObject { * @returns {Parse.Object} */ clone(): any { - const clone = new this.constructor(); - if (!clone.className) { - clone.className = this.className; - } + const clone = new this.constructor(this.className); let attributes = this.attributes; if (typeof this.constructor.readOnlyAttributes === 'function') { const readonly = this.constructor.readOnlyAttributes() || []; @@ -959,10 +956,7 @@ class ParseObject { * @returns {Parse.Object} */ newInstance(): any { - const clone = new this.constructor(); - if (!clone.className) { - clone.className = this.className; - } + const clone = new this.constructor(this.className); clone.id = this.id; if (singleInstance) { // Just return an object with the right id @@ -1831,7 +1825,7 @@ class ParseObject { throw new Error('Cannot create an object without a className'); } const constructor = classMap[json.className]; - const o = constructor ? new constructor() : new ParseObject(json.className); + const o = constructor ? new constructor(json.className) : new ParseObject(json.className); const otherAttributes = {}; for (const attr in json) { if (attr !== 'className' && attr !== '__type') { diff --git a/src/__tests__/ParseObject-test.js b/src/__tests__/ParseObject-test.js index 976b0bf12..6e72cc91a 100644 --- a/src/__tests__/ParseObject-test.js +++ b/src/__tests__/ParseObject-test.js @@ -3426,6 +3426,23 @@ describe('ParseObject Subclasses', () => { ); }); + it('can use on ParseObject subclass for multiple Parse.Object class names', () => { + class MyParseObjects extends ParseObject { + constructor(className) { + super(className); + } + } + ParseObject.registerSubclass('TestObject', MyParseObjects); + ParseObject.registerSubclass('TestObject1', MyParseObjects); + ParseObject.registerSubclass('TestObject2', MyParseObjects); + const obj = new MyParseObjects('TestObject'); + expect(obj.className).toBe('TestObject'); + const obj1 = new MyParseObjects('TestObject1'); + expect(obj1.className).toBe('TestObject1'); + const obj2 = new MyParseObjects('TestObject2'); + expect(obj2.className).toBe('TestObject2'); + }); + it('can inflate subclasses from server JSON', () => { const json = { className: 'MyObject',