手机版

简单了解js的原型属性及其使用

时间:2021-09-07 来源:互联网 编辑:宝哥软件园 浏览:

在进入正文之前,我得说说js原型的曲折过程。

百度js的原型文章,先看一下,W3School对原型的介绍:

你认为这个概念适合定义js的原型吗?你也认为原型是一个物体的属性吗?如果是,请仔细阅读我的文章,因为这篇文章会破坏你的人生三观,呵呵,这么严重,是因为我被这个定义搞惨了。

不得不说,在网上看了一些关于prototype的文章之后,基本上是说prototype是一个对象的属性,所以我坚信prototype是一个对象的属性,所以我被坑了很久,结果我反复误解别人写的包含prototype的js代码,也就是别人展示js的prototype属性写js代码的时候,我看的是他们写的代码。所以我讨厌原型,所以在这里,我今天一定要把js的原型属性说清楚。读者,请睁大眼睛,仔细看我下面的实验。

当然,希望各位读者能够静下心来,再做一次下面的实验,证明我的结论是正确的。

同时为了证明我没有骗你,呵呵,我们不要废话了,进入实验阶段吧。

首先介绍一个下面要用到的函数,JSON。stringfy(值)。

函数是将传入的参数值改为字符串,字符串有三个参数,第一个参数是必选项,另外两个参数可以填充也可以不填充。

关于函数JSON.stringify请见本文//www . JB 51 . net/article/29893 . htm,这里非常清楚。

首先,测试W3Schol的定义是否有效:

如果像W3Schol说的,原型是对象的一个属性,那么让我们创建一个对象,看看这个对象的原型是什么。

var ob={ };//超级简单的空对象警报(JSON)。stringfy (ob。原型));你认为上面的代码会提醒什么?既然原型是物体的属性,那你肯定能从中得到什么,对吧?但是,如果你实验这个代码,你会被打脸,因为它的警戒物是未定义的,也就是说,物体的属性原型不是一个东西,它是残酷的,但现实是这样的,任何引用原型的物体都会出现未定义,不信,你可以

我可以明确的告诉你,原型绝对不是针对对象的,对象根本不能引用原型。它的真正主人其实是一个函数。记住,能指原型的绝对是函数,绝对是函数,绝对是函数,原型属于函数。原型是属于函数的属性,只能被函数、函数、函数和重要的东西引用。别怪我这么墨色!

接下来,我想给原型一个真实的定义:

原型是函数的属性,也是函数的原型对象。

就这么简单。你能理解吗?原型只能由函数调用。

不要混淆js的对象和功能。js的对象和函数绝对是两个概念。为什么呢?因为js的函数函数可以新出对象对象,对吗?你应该知道的,对吧?

接下来,我将做一个实验来证明我的结论。

//首先定义一个著名的函数func func(){ } alert(func . prototype);说,上面的代码会提醒什么?还能不确定吗?我肯定告诉你,肯定不是未定义,因为我已经过了警戒,呵呵。

上图,弹出窗口是:

没错,对象被返回了。这一次,你会相信我一定是可以调用prototype的函数吗?当对象引用原型时,它返回的是未定义的东西,而不是某物。当一个函数引用原型时,它返回一个真实的事物对象。这还不足以证明原型是为了功能吗?你还不能证明物体不能引用原型吗?呵呵,多说一句。

我上面说过,原型是函数的一个属性,也是函数的原型对象,当func函数引用原型时,它返回的是一个对象对象,那么结合这两个概念可以得出什么结论呢?我想由此不难得出一个结论:

原型是功能的原型对象。你能理解吗?我无法理解。没关系。让我们做另一个实验。最后,我们将使用本文开头介绍的函数JSON.stringify()。

func(){ } alert(JSON . stringify(func . prototype));或者参考上面的函数func,只不过这里返回的是JSON.stringify()函数的返回值。

你没有看错,这里alert的结果是一个空对象,证明prototype确实属于函数的属性,而函数的prototype属性的js数据类型是一个对象,明白吗?为什么现在是空的物体?你想过吗?为什么呢?请思考这个问题三秒钟。想不出来也没关系。现在,让我解释一下。

先看实验代码:

function func(){ } func . prototype . name=' prototype是函数的一个属性,其本质是函数的原型对象';警报(JSON。Stringify (func。prototype))你认为上面的代码会提醒什么?请查看以下内容:

你没有弄错。这一刻,某种东西终于脱离了警戒。我是来给原型分配属性名的。那么,当我此时在alert func的原型中时,你看到了什么价值吗?看到原型属性的名称值了吗?现在再想想,为什么报警函数func.prototype在上面第一层的时候是一个空对象?而现在它是一个有价值的物体?

原因很简单,因为第一次没有给函数的func.prototype赋予name属性,也没有给函数的func.prototype赋予name属性,但是现在给函数的func . prototype赋予了name属性,值是函数的prototype对象,所以现在警惕

因此,这里得出结论:

原型是函数的属性,其本质是函数的原型对象。

不要以为js中只有对象才有属性。通过这一点,我们也可以知道js函数也是有属性的,而js函数似乎只有这个属性原型,而js的这个函数属性也是函数的原型对象。你糊涂了吗?我希望你没有糊涂。

为什么原型是函数的属性?因为只有函数才能调用prototype,而func.prototype是这样调用的,那么这样调用东西和调用对象的属性完全一样吗?是的,因为函数调用prototype的方式和对象调用属性的方式一样,所以我们把prototype作为函数的一个属性来调用,函数的这个属性实际上就是一个对象(不管这是不是对象,上面已经证明了,这里就不解释了)。因此,这个原型是函数的属性,其本质是函数的原型对象。

为什么在这里强调原型的本质是功能的原型对象?

看看下面的代码,证明我的代码非常简单:

//定义一个函数func(){} //给一个方法getfunc。prototype=函数(值){返回值;//很简单,你给我什么我就输出什么。}说说看,上面的get方法怎么叫?

让我给你一个提示。get是属于func函数的属性函数。既然是属性函数,怎么叫呢?

很简单,属性函数必须被它的对象调用,那么我们如何得到get的对象呢?很简单,你能用关键字new实例化func函数的对象吗?正确

接下来,实例化func函数的对象ob1:

var ob1=new func();//用func实例化的对象调用get属性函数alert(ob1.get('hello,prototype object ');

是的,用func函数实例化的对象ob1确实可以调用get函数,而且get函数alert已经被ob1调用了,证明了func函数的实例对象有属性func get,对吗?这么明显,不用解释。

如果不认为必须用实例化func的对象来调用get函数,可以尝试用func直接调用get函数,也就是可以尝试用func.get()来调用get函数,看看func能否直接调用get函数。我觉得肯定是错的,呵呵,是什么原因,你自己想吧。

所以说了这么多,还是没有解释为什么说原型的本质是功能的原型对象。正确

看,下面的代码:

var ob2=new func();//使用func实例化的对象调用get属性方法alert(ob2 . get(‘我还是func实例化的对象’));

看,我仍然使用func函数再次实例化ob2。这个对象仍然可以调用get属性函数。这是什么意思?这表明所有用func对象实例化的对象都可以调用属性函数get。在这种情况下,如果属性原型不是func的原型对象,为什么赋予原型的属性函数可以被func的所有实例化对象调用?如果原型的本质不是func函数的原型对象,那么根据func函数实例化的每个对象都不可能调用属性方法get,对吗?为什么呢?我们来做个比例,你说,一个不是源头的东西,能影响一切吗?你不能吗?因此,这里得出结论:

原型是函数的属性,其本质是函数的原型对象。

整篇文章就是为了说明这个结论。没有他。希望读者能理解这篇文章。对于原型的应用,我们将在下一篇文章中讨论,到此为止。

特别指出:

数组。原型是一个字符串。原型是一个字符串对象。原型是一个对象。这三个特殊的例子不同于构造函数的原型。当然,如果你真的理解原型是函数的原型对象,你应该知道数组的原型对象应该是数组,而不是对象。字符串的原型对象应该是字符串而不是对象,对吗?详情请见下一篇文章。

以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。

版权声明:简单了解js的原型属性及其使用是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。