我知道如何在javascript中循环烤箱对象I. 但是,当我尝试在一个对象的原型中做到这一点,然后我得到' undefined不是一个函数'错误。我的代码如下
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: '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
这不是拼写错误,所以不确定是什么时候发生..
谢谢..
答案 0 :(得分:1)
您正在使用res
创建的Object.create(null)
对象创建this.result,它使用null
作为其原型,因此它没有任何初始属性。您最终在语句
return res[test[0]] = test[1];
但是hasOwnProperty不在其中。您可以使用Object.create(Object)
创建空对象。
并且您希望使用引号中没有key
的版本:
// if(objIn.hasOwnProperty(key)){
答案 1 :(得分:1)
对象是引用类型。
Object.create(null)
返回没有原型的真空对象。例如:
var emptyObj = Object.create(null)
emptyObj.hasOwnProperty // Return undefined.
emptyObj.prototype // Return undefined.
所以:
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's 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;
}
我认为这是问题。