吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2102|回复: 8
收起左侧

[已解决] JS基础:构造函数的遍历对象(for in),怎么样才能把方法打印出来?(不要进来灌水)

[复制链接]
clearwater 发表于 2020-2-22 11:58
本帖最后由 clearwater 于 2020-2-22 12:19 编辑

请不要进来回复--‘支持’ ‘感谢分享’,‘学习了’,‘路过’等等,和主题无关的话题。

我在跟某前端视频学习。视频中老师在提到构造函数的遍历对象中说,for in 一般只用于构造函数的属性,用于构造函数的方法比较少,虽然for...in也能遍历其方法。
我有以下几个问题:
1、为什么for..in...在遍历构造函数里面的元素时,把函数名也打印出来了? 就不能光打印 函数里面要执行的内容吗? 比如下面代码中的hi
001.PNG

2. 为啥老师说for...in 比较少用于方法? 如果有的一个构造函数有10个方法,咋办?

3、如果一个构造函数里面既然属性,也有方法。当我用for ...in ...时,能不能只打出属性? 比如:属性10个,方法10个时,我只想遍历10个属性?
[JavaScript] 纯文本查看 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
   <script>
    var peter = {
      name: 'peter',
      sex: 'male',
      age: 30,
      sayHi: function(){
        console.log('hi');  
      }
    }
    peter.sayHi();
    
    for(var k in peter) {
      console.log(peter[k]);     
    } 
   </script>
</head>
<body>

</body>
</html>

免费评分

参与人数 1吾爱币 +3 热心值 +1 收起 理由
alittlebear + 3 + 1 加油~

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

alxe1528 发表于 2020-2-22 12:11
可以自己加检测啊
for(var k in peter) {
      if( peter[k] instanceof Function){
             contine;
      }
      console.log(peter[k]);     
}

免费评分

参与人数 2吾爱币 +1 热心值 +2 收起 理由
alittlebear + 1 我也来试试。
clearwater + 1 + 1 谢谢@Thanks!

查看全部评分

 楼主| clearwater 发表于 2020-2-22 12:18
本帖最后由 clearwater 于 2020-2-22 12:31 编辑
alxe1528 发表于 2020-2-22 12:11
可以自己加检测啊
for(var k in peter) {
      if( peter[k] instanceof Function){

谢谢大神的帮助。

幸好我前几天草草地看了我正在学习的视频的一点点后面部分,其中提到instanceof 的功能,否则我看不懂您在讲啥。(不过我没有再学习下去了,前面的知识忘记好多,我又返回复习了。)

您的方法我试了,可行。我也明白了。



@ alxe1528

我已经去站务反馈异常了。为啥给您评分了,您的热心值,还是0. 如果有bug,管理debug之后,我再给您重新评分。

免费评分

参与人数 1热心值 +1 收起 理由
alittlebear + 1 热心回复!

查看全部评分

liouxin 发表于 2020-2-22 12:32
本帖最后由 liouxin 于 2020-2-22 12:46 编辑

‘支持’ ‘感谢分享’,‘学习了’,‘路过’

楼主的意思是想输出如下效果吧:
hi
peter
male
30
hi


如果是这个效果的话,你可以按照二楼的方法加个if判断,如果是function的话,就直接执行该function就行了,比如:
for(var k in peter) {
    if( peter[k] instanceof Function){
         peter[k]();
    }else{
            console.log(peter[k]);
    }
或者:
for(var k in peter)        {
    if(typeof(peter[k]) == 'function'){
            peter[k]();
    }else{
            console.log(peter[k]);
    }
}

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
clearwater + 1 + 1 谢谢@Thanks!

查看全部评分

可爱的男孩子 发表于 2020-2-22 12:37
我的疑问,你的代码跟构造函数没有任何关系,不知道你又看了什么辣鸡视频对你造成了某些误解
你的核心疑问就是对象的遍历方式for-in语句

1、为什么for..in...在遍历构造函数里面的元素时,把函数名也打印出来了? 就不能光打印 函数里面要执行的内容吗? 比如下面代码中的hi
你这里的输出和遍历方式无关
而是和console.log有关,它在输出函数时会调用函数自身的tostring也就是字符串形式
此时就会获取到这样的内容
   
2. 为啥老师说for...in 比较少用于方法? 如果有的一个构造函数有10个方法,咋办?
forin循环你想遍历什么都无所谓,取决你你的需求,只要它的返回值对你有用
如果非要说这个东西为什么用的少
那只有一个原因
它会遍历对象自有的、继承的、可枚举的、非Symbol的属性
也就是说原型里的某些东西会出来影响你

3、如果一个构造函数里面既然属性,也有方法。当我用for ...in ...时,能不能只打出属性? 比如:属性10个,方法10个时,我只想遍历10个属性?
首先forin遍历出的全是字符串类型的属性名,也就是它们本身并没数据类型
typeof obj[key] === 'function'
然后判断决定你要做什么

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
clearwater + 1 + 1 谢谢@Thanks!

查看全部评分

wy543668913 发表于 2020-2-22 12:39
本帖最后由 wy543668913 于 2020-2-22 12:42 编辑

遍历到sayHi时候,因为是函数,你又没执行,所以直接打印出函数体了。对了函数里面用return
参考代码:
var peter = {      name: 'peter',      sex: 'male',      age: 30,      sayHi: (function(){        return 'www'       })()    }     console.log(peter.sayHi)    for(var k in peter) {      console.log(peter[k]);         }

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
clearwater + 1 + 1 热心回复!

查看全部评分

 楼主| clearwater 发表于 2020-2-22 12:49
@ liouxin
@ 可爱的男孩子
@wy543668913

谢谢你们的帮助,帮我进一步搞清了问题。今天论坛上好象出bug了,我给本楼沙发的大神评分后,他的热心值总数还是0。 所以我现在不给你们都评分了,免得浪费我的能量。

我已去站务反馈异常了,如果有bug,等论坛处理好之后,我再给你们补评分,否则给了,你们也收不到,我的能量也浪费。(我当天手上有几个,我就评几个。先回先评,后面不要误会,只给张三,不给李四。没评分的,要等过一二天,我有能量再评分)

免费评分

参与人数 1吾爱币 +3 热心值 +1 收起 理由
alittlebear + 3 + 1 我很赞同!

查看全部评分

 楼主| clearwater 发表于 2020-2-22 12:51
本帖最后由 clearwater 于 2020-2-22 14:33 编辑
wy543668913 发表于 2020-2-22 12:39
遍历到sayHi时候,因为是函数,你又没执行,所以直接打印出函数体了。对了函数里面用return
参考代码:
v ...

哪怕乱码,我也能看到之前您的代码是什么意思。

只要点击纯文本,我就看到了。谢谢。

[Asm] 纯文本查看 复制代码
var peter = {
      name: 'peter',
      sex: 'male',
      age: 30,
      sayHi: (function(){
        return 'www' 
      })()
    }
     console.log(peter.sayHi)
    for(var k in peter) {
      console.log(peter[k]);     
    }

免费评分

参与人数 1吾爱币 +2 热心值 +1 收起 理由
alittlebear + 2 + 1 我很赞同!

查看全部评分

alxe1528 发表于 2020-2-25 11:36
clearwater 发表于 2020-2-22 12:18
谢谢大神的帮助。

幸好我前几天草草地看了我正在学习的视频的一点点后面部分,其中提到instanceof 的 ...

不客气,哈
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 22:34

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表