javascript - 这个 for in 的遍历问题想不通,心累啊!!
阿神
阿神 2017-04-10 16:21:40
[JavaScript讨论组]

在这里for in可以遍历得到 person的属性;

可是得不到 car 的属性;

我的理解是这样的:

function car(){};他也是个对象,但是他又是个函数,而且在文中car 他并没有调用,他里面的没有执行,所以什么都没有!

如果没错,那我的问题又来了:

我们在 用原型 prototype拓展某些功能的时候,经常会这样写:

既然 prop在遍历 function的时候什么都不是,那这种遍历赋值的写法有什么意思呢??

阿神
阿神

闭关修行中......

全部回复(3)
PHPz

题主你说的这两种不一样的呀。
1,for (var key in car) { console.log(key) }中的car是个字符串类型的函数名称。
为什么又说car是个对象呢,因为car是通过new Function出来的。
要遍历可以这么写:for (var key in (new car)) { console.log(key) }

2.正因为函数都是new Function出来的,所以在Function的原型上增加一个extends方法,那么所有new出来的函数都有了这个extends方法,这个方法是给new出来的函数添加原型方法或者属性

黄舟
  1. 函数也是对象,当然可以遍历其属性,只不过其没有属性或定义的属性被设置为不可遍历了

    function foo(){
    
    }
    foo.myName="foo";
    for(var prop in foo){
        console.log(prop);//myName
    }
  2. 你的extends写错了吧~~
    在base中遍历属性,在prototype中获取值?应该是这样的:(其实也有问题~)

    Function.prototype.extends=function(base,extend){
        for(var prop in base.prototype){
            this.prototype[prop]=base.prototype[prop];
        }
        for(var prop in extend.prototype){
            this.prototype[prop]= extend.prototype[prop];
        }
    };

    通过函数原型的extends方法,可以把extend函数对象的原型属性添加到base中,
    还需要检查传入的base,extend是不是函数,只有函数对象才会有prototype属性
    实例对象是没有这个属性的
    如果extend是个数组结构会更有扩展性吧

    function Car(){
        this.name=123;
        this.age=456;
    }
    Car.prototype.run=function(){
        console.log(this.name+" can run~~~");
    }
    function BenzCar(){
        this.name="Benz";
        this.age=99999;
    }
    
    BenzCar.prototype.fly=function(){
        console.log(this.name+" can fly:)~~~");
    }
    
    function SuperBenzCar(){
        this.name="SuperBenzCar";
        this.age=99999;
    }
    
    SuperBenzCar.extends(Car,BenzCar);
    
    var superBenzCar=new SuperBenzCar();
    
    superBenzCar.run();
    superBenzCar.fly();

    更正下,如果extends传入的第2个参数为对象字面量形式的话

Function.prototype.extends=function(base,extend){
    for(var prop in base.prototype){
        this.prototype[prop]=base.prototype[prop];
    }
    for(var prop in extend){
        this.prototype[prop]= extend[prop];
    }
};

function Car(){
    this.name=123;
    this.age=456;
}
Car.prototype.run=function(){
    console.log(this.name+" can run~~~");
}

   function BenzCar(){
    this.name="Benz";
    this.age=99999;
}

BenzCar.extends(Car,{
    fly:function(){
        console.log(this.name+"  can fly:)~~~");
    }
});

 var benzCar=new BenzCar();

benzCar.run();
benzCar.fly();
PHP中文网
  1. 下面这个car叫做构造函数

function car(){
    this.name = 123;
    ...
}

构造函数用于初始化一个对象

var cObj = new car();

构造函数内部的代码,用于初始化这个对象的属性。这里 cObj 会具有一个独立的name属性。
而通过 for in 遍历构造函数,只会得到构造函数的可遍历的属性而已,并不会包含这个 name。

  1. Function.prototype.extends

Function是所有function的构造函数。也就是说,你定义一个function,这个function就是 Function 的对象了。

注意一下这个函数内部的逻辑,它向this.prototype添加或修改属性,这个this,指的是实际的function。

Function.prototype.whoami = 'haha';
function a(){}
console.log(a.whoami);

输出结果是 'haha'。

所以,你可以通过向 Function.prototype增加属性,而变向的向所有function增加属性。这是有意义的

以上。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号