看透JavaScript:原理、方法与实践
上QQ阅读APP看书,第一时间看更新

8.2 Window对象的特殊性

浏览器的Global对象window是使用Window对象创建出来的,Window对象是function类型,window对象是object类型。用于创建window对象的Window对象跟我们自定义的function对象之间存在一些区别。下面就来给大家介绍几点。

8.2.1 不可以创建对象

我们自己创建的function对象都可以使用new关键字来创建相应的object类型实例对象,但是Window对象不可以用于创建对象。这一点很容易理解,如果可以使用Window对象创建实例对象,那么创建出来的对象就不是全局对象了,并且也不是在进入执行环境之前创建的,而是在进入执行环境之后才创建的,这就不符合标准了,另外使用上也会造成混乱。因此Window对象是不可以直接使用new关键字来创建实例对象的。

除了Window对象之外,还有一些function类型对象也不可以用来创建对象。例如,Math对象就不可以创建实例对象,因为它主要是使用其中的方法属性来完成各种数学运算的。另外,我们前面介绍过的包装对象的prototype中function类型的属性对象,例如Sting的prototype属性对象中的indexOf、charAt等,它们的作用是完成具体的功能,因此也不可以使用它们来创建实例对象。

8.2.2 不可以作为方法调用

Window也不可以作为方法来调用,也就是说,在程序中直接调用Window()也是不可以的,并且这种用法也没有实际意义。

8.2.3 变量就是属性

在最外层定义的变量也叫作全局变量,与在function中定义的其他变量存在很大区别。在最外层定义的变量会自动成为window对象的属性,而在普通function中变量和实例对象的属性是完全没关系的两类数据,例如下面的例子。

    var v = 1;


    //通过修改this的属性可以改变全局变量的值
    this.v = 2;
    console.log(v);           //2


    //通过修改全局变量的值也可以修改window对象同名属性的值
    v = 3;
    console.log(window.v);   //3


    //我们自定义的方法中变量和实例对象的属性是相互独立的
    function Obj(){
        var v = 4;
        this.v = 5;
        console.log(v);
    }
    new Obj();                //4

从这个例子中可以看出,最外层定义的变量和this的属性及全局对象window的同名属性都是同一个,可以相互操作。但是,在我们自定义的function函数体内变量和属性之间存在严格区分,不可以相互调用。

只有在最外层定义的变量和属性可以相互调用,在其他情况下都不可以,这一点一定要记清楚。

另外,window对象本身也是自己的一个属性。对于这点可以通过下面的方法获取window对象的属性来查看。

    Object.getOwnPropertyNames(window);