Heim > Fragen und Antworten > Hauptteil
如下列示例代码:
我本意,是想封装一个页面的对象,对外提供一个getWidgetLength()
的公共方法,打印控件数量。
但是在闭包当中,竟然没办法获取数组.length的值,跪求各位大神指教!
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script type="text/javascript">
var PageObj = (function(){
//私有属性:页面的控件名集合
var widgetNames; //一开始没有实例化
function initPage(){
//调用公共的Util包,它给我返回的,竟然是一个Map (- -!!!
//widgetNames = WidgetUtil.getAllWidget();
widgetName = {"001":"loginName","002":"loginPwd","003":"loginCode","004":"loginBtn","005":"clearBtn"};
}
return {
//公共方法:打印页面控件的数量
widgetLength : function(){
try{
//求解:widgetName不能使用length、shift()、slice()等属性/方法,
console.info(widgetNames.length);
}catch(e){
console.error(e);
}
}
}
})();
PageObj.widgetLength();//调用
</script>
</body>
</html>
补充说明:
非常抱歉,示例确实存在代码拼写错误:应该是console.info()
经过检查项目代码发现,我遇到的实际问题是: Object对象的length如何获取? (大神们,你们有没有封装获取对象length的通用方法?不管Array、Object都能得到他的item数量)
巴扎黑2017-04-11 13:27:49
可以这样写,(你给的源码有错误,需要修改)
var PageObj = (function(){
//私有属性:页面的控件名集合
var widgetNames; //一开始没有实例化
function initPage(){
//调用公共的Util包,它给我返回的,竟然是一个Map (- -!!!
//widgetNames = WidgetUtil.getAllWidget();
widgetNames = {"001":"loginName","002":"loginPwd","003":"loginCode","004":"loginBtn","005":"clearBtn"};
}
var length = function() {
if(Object.keys) { return Object.keys(this).length;}
var c = 0;
for(k in this) {
if(this.hasOwnProperty(k)) { c++;}
}
return c;
}
// or
Object.prototype.length = length;
return {
//公共方法:打印页面控件的数量
widgetLength : function(){
try{
//求解:widgetName不能使用length、shift()、slice()等属性/方法,
console.info(length.call(widgetNames));
//OR
console.log('method2',widgetNames.length());
}catch(e){
console.error(e);
}
},
initPage:initPage
}
})();
PageObj.initPage();//调用
PageObj.widgetLength();//调用
天蓬老师2017-04-11 13:27:49
Into是什么。。
var PageObj = (function() {
//私有属性
var widgetNames = ["loginName", "loginPwd", "loginCode", "loginBtn", "clearBtn"];
return {
widgetLength: function() {
window.console.log(widgetNames.length);
}
}
})();
PageObj.widgetLength();
怪我咯2017-04-11 13:27:49
你的代码里面有很多问题,拼写的问题和用法的问题:
最关键的问题在于;
1.initPage函数没被调用,所以widgetNames并没有被初始化
2.在initPage里面,widgetNames被初始化成了一个obj,而不是array,但是obj并没有length属性!!
帮你改好了。
var PageObj = (function(){
//私有属性:页面的控件名集合
var widgetNames; //一开始没有实例化
function initPage(){
//调用公共的Util包,它给我返回的,竟然是一个Map (- -!!!
//widgetNames = WidgetUtil.getAllWidget();
widgetNames = {"001":"loginName","002":"loginPwd","003":"loginCode","004":"loginBtn","005":"clearBtn", "length": 5};
}
initPage();
return {
//公共方法:打印页面控件的数量
widgetLength : function(){
try{
//求解:widgetName不能使用length、shift()、slice()等属性/方法,
console.info(widgetNames);
console.info(widgetNames.length);
}catch(e){
console.error(e);
}
}
}
})();
console.log(PageObj);
PageObj.widgetLength();//调用
天蓬老师2017-04-11 13:27:49
我能想到的就是for in轮询一次然后每次执行代码的时候计数器自增
let count=0;
for(let i in widgetNames){
count++;
}