宝哥软件园

分析JavaScript面向对象概念中的对象类型和范围

编辑:宝哥软件园 来源:互联网 时间:2021-10-31

参考类型

引用类型主要包括:对象类型、数组类型、日期类型、正则表达式类型、函数类型等。

当使用引用类型时,需要从它们生成一个对象(实例)。也就是说,引用类型相当于模板。当我们想要使用引用类型时,我们需要使用这个模板生成一个对象来使用,所以引用类型有时被称为对象定义。

例如,我们需要生成一个person Object来定义某人的个人信息和行为,因此我们需要依赖Object类型:

var person=new Object();人名='姜水';person . SayName=function(){ console . log(this . name);}上述人员对象由对象类型的“模板”通过新操作符定义。然后可以向这个对象添加属性名和方法sayName。属性和方法是对象类型的“函数”,因此由引用类型(如对象)创建的对象可以使用它。

您不必使用新运算符来创建对象。有一些类型可以简化。例如,您可以创建上述对象类型的对象。您也可以使用以下两种方法:

var person={ };人名='姜水';person . SayName=function(){ console . log(this . name);}或

var person={ name : '姜水',say name : function(){ console . log(this . name);}};{}运算符的功能就像新的Object(),简化了操作。以上两种写作方法有些不同。第一个是“追加”,即在前面的定义中,继续添加属性或方法,如果已经存在同名的属性方法,则会被覆盖。第二种是“替换”,即不管之前是否定义了person对象的属性和方法,这个方法都会用新定义的内容完全替换之前定义的。因为引用类型生成的对象是存储在内存中的一个区域,然后它的指针保存在一个变量(person)中,所以第二种写入方式是生成一个新的对象(新的内存区域),然后将person变量指向新的内存区域,所以前一个被替换。理解这一点对以后的理解非常重要。

其他引用类型的用法大致相同,例如Array类型。您也可以使用[]生成对象或直接定义它们。生成Array对象后,可以根据数组的格式存储信息内容。另外,对象可以获取数组类型中定义的方法,如push、shift、sort等。并且可以调用这些方法,例如:

var colors=[];colors.push('red ',' green ');console.log(颜色);上面的代码是通过array类型创建一个Array类型的对象,然后在Array类型中调用前面定义的push方法,给对象加上红色和绿色两个值,最后在控制台上打印出来,就可以看到了。

调用callapply方法。

这两种方法由Function类型提供,也就是说,它们可以在函数上使用。调用apply方法的功能与调用apply方法相同,即可以扩展函数操作的范围。不同之处在于,使用调用时,传递给函数的参数必须一个接一个地列出,而不使用apply方法。这样,您就可以根据自己的功能需求决定使用call还是apply。

扩展函数运行的范围是什么意思?举个例子你就明白了。

您可以理解,函数被包装在一个容器(范围)中,并且在这个容器中有一些变量或其他东西。当函数运行并调用这些变量时,它将在当前容器中寻找这个东西。事实上,这个容器也是用一个更大的容器包裹的。如果当前的小容器不存在,函数将在更大的容器中搜索,以此类推,直到找到最大的容器窗口对象。但是,如果函数在当前的小容器中运行,小容器中有对应的变量,即使在大容器中,函数也会调用自己的容器。

调用和应用方法解决了这个问题,突破了容器的限制。对于前面的示例:

var person={ name : '姜水',say name : function(){ console . log(this . name);}};打开Chrome的Console后,粘贴进去执行,然后执行person.sayName()。

2016510174813378.png  (926572)

此时,person是一个容器,其中创建了一个sayName方法(函数),必须在person的作用域下执行。当直接在底部执行,即在window的作用域下执行时,会报错为未定义,因为在window下没有定义sayName方法。里面的这个指针是一个特殊的东西,它指向当前的范围。这个. name的意思是调用当前范围之下的名称值。

让我们给窗口对象添加一个名称属性:

window.name=' yujiangshui或者直接。

名称='玉江水';因为窗口是最大的容器,所以可以省略。所有定义的属性或变量都附加到窗口。如果你不相信,你可以看到:

2016510174850232.png  (486412)

现在我们想在大容器窗口下的person容器中运行sayName方法,所以我们需要使用call或apply来扩展sayName方法的范围。执行以下语句:

person.sayName.call(窗口);或者

person . say name . call(this);输出结果都是一样的。您也可以使用apply来查看效果。因为这个演示太简单了,不需要传递参数,所以调用和应用的函数效果是完全一样的。

2016510174922644.png  (438360)

解释上面的代码,sayName首先是Function类型的一个实例,它包括调用方法和应用方法。由于call和apply方法都是Function类型的方法,所以需要调用person.sayName.call(window)而不是person.sayName()。呼叫(窗口)。

然后,调用和应用方法的参数是一个作用域(对象),它指示前一个函数将在传入的作用域下运行。将对象窗口传入后,sayName方法中的this.name指向window.name,因此范围扩大了。

为什么擦窗和这个有同样的效果?因为我们当前执行这个函数的位置是window,如前所述,这个指针指向当前范围,所以这个指向window,所以它等于window。

更多资讯
游戏推荐
更多+