Looping an object in a prototype
I know how to process an object i am in javascript. But when I try to do it inside the object prototype, I get the error "undefined is not a function". My code is below
var createObject = function(strIn) {
this.result = strIn;
}
createObject.prototype.toObject = function() {
var objData = this.result.split('&');
this.result = Object.create(null); //{}
var res = Object.create(null);
objData.forEach(function(value, index) {
var test = value.split('=')
return res[test[0]] = test[1];
});
this.result = res;
res = Object.create(null);
return this.result;
}
createObject.prototype.toString = function() {
//{ jake: 'dog', finn: 'human' }
//"jake=dog&finn=human"
var key,
objIn = Object.create(null),
returnresult = '';
objIn = this.result; //this is causing issue
console.log('obj', objIn);
console.log(typeof(objIn))
for (key in objIn) {
console.log(objIn.hasOwnProperty('key')) //trying to see wht this results in ::GIVES 'undefined is not a function error'
// if(objIn.hasOwnProperty(key)){
// returnresult += key+'='+objIn[key]+'&'
// }
}
this.result = returnresult;
returnresult = Object.create(null);
return this.result;
}
var test = new createObject('jake=dog&finn=human');
console.log(test);
console.log(test.toObject())
console.log(test);
console.log(test.toString());
console.log(test);
Result and error as below:
{ result: 'jake=dog&finn=human' }
{ jake: 'dog', finn: 'human' }
{ result: { jake: 'dog', finn: 'human' } }
obj { jake: 'dog', finn: 'human' }
object
solution.js:52
console.log(objIn.hasOwnProperty('key') )
^
TypeError: undefined is not a function
at createObject.toString (solution.js:52:23)
at solution.js:68:18
This is not a spelling error, so not sure what is going on ..
Thank..
source to share
Objects are reference types.
Object.create(null)
returns a truly empty object with no prototype. For example:
var emptyObj = Object.create(null)
emptyObj.hasOwnProperty // Return undefined.
emptyObj.prototype // Return undefined.
So:
createObject.prototype.toObject = function() {
var objData = this.result.split('&');
this.result = Object.create(null); //{}
var res = Object.create(null);
objData.forEach(function(value, index) {
var test = value.split('=')
return res[test[0]] = test[1];
});
// Here you say - this.result = res
// But it reference type, so the address of this variable will be
// Setted to `this`
this.result = res;
// here you change the reference value of res.
// so this.result will be = Object.create(null) after next line exec.
res = Object.create(null);
return this.result;
}
I think this is the problem.
source to share
You are creating this.result from an object res
created with Object.create(null)
which it uses null
as its prototype, so it doesn't have any initial properties. You end up assigning some properties in the statement
return res[test[0]] = test[1];
but hasOwnProperty is not one of them. Instead, you can create empty objects with Object.create(Object)
.
And you want to use a version that doesn't have key
quotes:
// if(objIn.hasOwnProperty(key)){
source to share