当前位置:首页 > 日记 > 正文

用Javascript深入研究原型原型

用Javascript深入研究原型原型
Javascript是一种基于原型的编程语言,它与我们通常基于类的编程有很大的不同。我列出以下要点。

1。函数是一个类对象,这意味着函数与对象具有相同的语言状态。

2。没有类,只有对象

3。函数也是一个对象,所谓函数对象。

4。对象是通过引用传递的。

那么基于原型的编程语言是如何继承继承的(这是OO的一大基础元素),这就是原型的起源。

请看下面的代码片段:
函数(a,b,c)
{
返回;
}
警报(长度);
警报(typeof foo。构造函数);
警报(typeof foo调用);
警报(typeof foo。适用);
警报(typeof foo。原型);
对于上面的代码,当你运行浏览器时,你会发现:

1.length:提供对函数参数的个数

2.prototype:是一个对象

三.其他三个功能

对于任何函数的声明,它将有上面描述的5个属性(方法或属性)。

下面我们来看看原型。
原型
功能人(姓名,性别)
{
this.name =名称;
this.gender =性别;
this.whoareyou =功能({ / /)这就是所谓的封闭,内部函数可以访问外部函数的变量
VaR既=我+ this.name + 我+ this.gender + 。;
返回水库;
};
}
因此,在人创建的对象中有以下属性
person.prototype.age = 24;
person.prototype.getage =函数(){
返回this.age;
};
标志=真;
如果(国旗)
{
新的人(塔
警惕(有趣,名字);
警惕(有趣,性别);
警报(fun.whoareyou());
警报(fun.getage());
}
person.prototype.salary = 10000;
person.prototype.getsalary =函数(){
返回this.name +能挣+ this.salary +人民币每个月。;
};
下面是最令人惊奇的地方,/我们改变了人原型,在创造乐趣之后改变了这个原型。
尽管这个更改使乐趣具有相同的属性和方法。
这意味着继承
如果(国旗)
{
警报(fun.getsalary());
警报(乐趣。构造函数。原型。年龄); / /这就相当于你直接打电话给person.prototype.age
警戒(人,原型,年龄);
}
从上面的例子中,我们可以发现,对于原型的方法或属性,我们可以动态地增加,并且由它创建的对象将自动继承相关的方法和属性。

此外,每个对象都有一个构造函数创建的函数对象的属性,如在fun.constructor点的例子是人。

然后自然会出现一个问题,函数对象声明的方法和属性和原型声明的属性有什么区别

有以下差异:

1、自我声明的方法和属性是静态的。也就是说,在声明之后,您尝试添加新的方法或修改现有的方法,而不会影响它们创建的对象,也就是说,继承失败。

2、原型可以动态地添加新的方法或修改现有的方法,但它是动态的。一旦父函数对象声明相关的原型属性,由它创建的对象将自动继承这些原型的属性。

继续上述示例:
标志=真;
方法语句内部函数是静态的,无法传递。
person.school = 与;
person.whoareyou =函数(){
返回zhutao ;
}动态更改声明期,不受对象创建方法的影响,所谓静态
如果(国旗)
{
警戒(人、学校);
警报(有趣的学校);输出未定义
警报(人。whoareyou)(zhutao); / /输出
警报((乐趣。whoareyou)); / /我是Tower,我是一个男。
}
person.prototype.getsalary =函数(){
返回我可以赚1000000美元;
};
如果(国旗)
{
警报((乐趣。getsalary)); / /继承了所谓的动态变化。
}
由于函数对象本身的性质和原型的性质,那么由它创建的对象如何搜索相应的属性呢

基本上,它是在以下过程和顺序中进行的。

1。首先搜索函数对象本身的属性,如果它立即被找到

2、如果找不到1,它将搜索原型属性。有2个结果。如果找到它,它将直接执行,否则它将继续搜索父对象的父对象的原型,直到找到或到达原型链的结尾(结束将是对象对象)。

上述答案如果属性函数对象本身与解决方案的原型属性(name)相同,则对象函数本身是首选的。

原型的典型例子

使用jQuery或原型库的朋友可能知道所有这些库通常都有修剪方法。

实例:
string.prototype.trim =函数(){
返回this.replace( / ^ + | + $ /克,);
};

装饰使用:
foo bar。修剪('foo); / /酒吧

但这样做有一个缺点,因为新版本的浏览器中的Javascript引擎在String对象本身中提供了修剪方法。然后,我们自己定义的修剪将覆盖修剪本身。事实上,在我们定义修剪方法之前,我们可以做一个简单的测试,看看我们是否需要自己添加这个方法:
如果(!字符串.原型.修剪){
string.prototype.trim =函数(){
返回this.replace( / ^ + | + $ /克,);
};
}

原型链

当Javascript定义或实例化任何对象,它将添加一个隐藏属性命名__proto__。原型链是由这个属性形成,但不直接进入__proto__属性,因为有些浏览器不支持直接访问。此外,该__proto__对象和原型的属性是不一样的东西;他们每个人都有各自的用途。

你是怎么理解的事实上,当我们创建一个MyObject的功能,我们实际上创建函数对象类型:

console.log(typeof MyObject); / /功能

这里是解释功能是Javascript中的一个预定义的对象,所以它也有自己的预定义属性(如长度和参数)和方法(如电话申请),并__proto__,当然,从而实现原型链,有可能是一个代码片段像Javascript发动机下面:
function.prototype = { {
参数:null,
长度:0,
调用:函数(){
机密代码
},
应用:函数(){
机密代码
},

};

事实上,Javascript引擎代码不能这么简单。下面是对原型链如何工作的描述。

我们定义一个函数MyObject,具有另一个参数的名称,但它不会给任何其他属性,如长度或其他方法,如呼叫。所以为什么下面的代码被执行,正常吗
console.log(MyObject。长度); / /结果:1、多参数

这是因为我们定义的MyObject,又定义了一个__proto__属性,和Function.prototype的价值(指前面的代码片段),所以我们可以访问其他属性的访问myobject.length,即使我们不定义该属性,因为它会跟随__proto__原型链上长度,最后发现在功能。

那么为什么长度属性的值是1,而不是0,什么时候赋值给它呢由于MyObject是函数的一个例子:
console.log(MyObject instanceof功能); / /真的
console.log(MyObject =功能); / /假

当实例化一个对象,该对象的__proto__属性分配给它的构造函数的原型对象。在这种情况下,函数被使用。此时,构造函数返回计算参数的数量并更改长度的值。
console.log(MyObject。__proto__ =函数原型); / /真的

当我们创建一个新的实例与新的关键词,新对象的__proto__将分配到myobject.prototype,因为构造函数是MyObject代替功能。
无功myinstance =新的MyObject('foo);
console.log(myinstance。__proto__ = MyObject。原型); / /真的

除了访问调用,适用于从function.prototype继承,新的对象也可以访问从MyObject继承getName方法:
Console.log((myinstance。getName)); / / Foo

无功mysecondinstance =新的MyObject('bar);

Console.log((mysecondinstance。getName)); / /酒吧
Console.log((myinstance。getName)); / / Foo

事实上,这相当于使用原型对象作为蓝图,然后您可以基于这个蓝图创建N个新对象。
看一个多原型链的例子。
多个原型链实例
职能雇员(姓名)
{
this.name = ;
this.dept =一般;
this.gender =未知;
}
workerbee()函数
{
this.projects = { };
this.hascar = false;
}
workerbee.prototype =新员工; / /原型第一层链
功能工程师()
{
this.dept =工程师; / / 覆盖的父对象
this.language =Javascript;
}
engineer.prototype =新workerbee; / /第二层原型链
Var Jay =新工程师();
如果(国旗)
{
警报(周杰伦);工程师,找到它自己的属性
警报(Jay。hascar); / /假,搜索是一层性能
警报(周杰伦性别);未知,搜索其两层属性
}
上面例子的对象关系如下:

相关文章

模糊锐化和涂抹工具在使用PS图象处

模糊锐化和涂抹工具在使用PS图象处

锐化,模糊,图象处理,工具,软件工具,ps的模糊工具包含三个工具——模糊工具、锐化工具和涂抹工具。这三个工具可以部分地修改图像的细节。本文将告诉您如何使用它们以及如何使用它们。 在ps的模糊工具中有三种工具:模糊工具、锐化工具和涂抹…

如何制作一个波浪线PPT基本教程

如何制作一个波浪线PPT基本教程

教程,波浪,电脑软件,PPT,powerpoint2013不提供一个波浪线的形状,如果我们想用PPT画线会比较麻烦,没有人没有绘画基础,某些功能,我们可以使用powerpoint2013使,这里教你,在一起。 1、启动PPT,在幻灯片中插入一个文本框,我们使用微软拼音输入法打波浪…

WPS如何隐藏WPS演示教程中的音乐播

WPS如何隐藏WPS演示教程中的音乐播

音乐播放,图标,教程,演示,电脑软件,把音乐添加到演示中可以给演讲过程增添一些色彩,使整个过程变得精彩,但不够的是会有一个插入音乐后,播放按钮,它的存在确实影响了美感,分散了我们的视线,那么我们如何隐藏音乐播放图标呢这是一个小技巧,只需几个…

PS图象处理软件创造的外部光绿色经

PS图象处理软件创造的外部光绿色经

创造,图象,处理软件,经典,电脑软件,本文主要介绍了PS图象处理软件,创造了梦幻般的绿色和绿色的户外文字及图片经典。这个教程不复杂,效果很好。喜欢的朋友可以一起学习。 材料图片的主色为黄绿色,主色调为绿色,然后由中性暗绿色教学减少饱和度…

PS教你如何把帅哥变成皱纹满面的老

PS教你如何把帅哥变成皱纹满面的老

满面,教你如何,老人,帅哥,电脑软件,今天,小编辑教你怎么用PS把英俊的年轻人变成老人,教程不是很难,你喜欢的朋友可以学着走到一起。 作者非常详细的介绍了如何变老的人,过程:先找一些年轻人与老照片相比,发现老人脸上的一些变化,如好的合成;然后发…

动画中的火焰运动规律

动画中的火焰运动规律

运动,画中,火焰,规律,电脑软件,火焰也是一种动画现象,经常需要在动画片中加以展示。你是怎么做的火焰定律是什么让我们看下它。 火焰是一个动画的现象,往往需要在动画显示。火又可以分为小火(如燃烧的蜡烛,火柴燃烧等)、较大火灾(如木柴燃烧,等),大…

phootshop设计动态喷雾酷运动鞋

phootshop设计动态喷雾酷运动鞋

动态,电脑软件,phootshop,效果图是常见的飞溅物理效应。制作的方法有很多种。这里介绍的方法也是实用的。这个过程是先移除或绘制背景颜色。 效果图比较常见,真正的飞溅效果,有很多的制作方法,这里介绍的方法也是相当实用的,流程:首先添加局部…

excel表格样式数据汇总教程Excel基

excel表格样式数据汇总教程Excel基

教程,基金会,数据,样式,表格,对一个表格的数据进行总结会花很多时间。如果以通常的方式完成,这将花费太多的时间,当然有一些简单而快速的方法来完成。在这里,我将教您使用表样式来收集数据。 首先,打开要处理的Excel表格,选择数据区域,单击菜单栏…

如何写斜体的CDR制作CDR斜体字符的

如何写斜体的CDR制作CDR斜体字符的

斜体,字符,如何写,过程,电脑软件,如何写斜体的CDRCDR不需要Word和其他编辑软件,直接点击斜体字体可以倾斜,如何CDR作出斜体字以下详细的生产过程是共享的,您需要的朋友可以参考这个过程。 如何写斜体的CDR我经常看到各种漂亮的斜体字在CDR,但是…

Word2007设置默认字体的方法Word20

Word2007设置默认字体的方法Word20

设置,默认,方法,字体,教程,设置默认字体确保每个新打开的文档设置你选择的字体设置为默认,默认的字体应用于活动模板(模板):一个或多个文件,包括结构和工具的形式完成文件的样式和页面布局等元素。例如,Word模板可以生成一个单一的文件,和FrontPag…

Word2003的基本操作word2003教程

Word2003的基本操作word2003教程

教程,基本操作,电脑软件,下面是与你分享的Word 2003的基本操作。我希望你能帮助你。 1。启动Word 2003 2003这个词是以三种不同的方式开始的。 首先单击RARR;具有具有;;;软件;微软word命令,启动Word 2003。 双击桌面Word 2003快捷方式上的图标,开…

如何按字母顺序排序Word2010教程Wo

如何按字母顺序排序Word2010教程Wo

教程,排序,字母,顺序,电脑软件,当排序在Word2010表格,我们有时需要在最初的英文字母顺序排序。那么如何在Word2010的拼音字母排序,然后介绍实现方法。 1、打开Word2010文档,并单击表游离细胞。 2、点击布局选项卡。 3、在数据上单击排序按钮。…