当前位置:首页 > 生活百科

javascript原型链详解(js中原型和原型链)

栏目:生活百科日期:2025-01-21浏览:0

一、原型

1.函数原型

在JavaScript中,函数不仅仅是一个可以重用的代码块,而且还可以作为一种数据使用。在堆空间中为函数分配了它的存储空间,函数名或函数的其他形式的引用保存了这个存储空间的引用地址。所以JavaScript中的函数是一种引用数据类型,这就是为什么我们说JavaScript中的函数也是对象。

那么函数这样的对象有很多特殊的性质,原型就是其中之一。每一个函数对象都包含一个属性:prototype。当我们声明一个函数时,函数对象就创建好了。而函数对象创建的同时,系统还会同时创建一个对象,并让函数对象的prototype属性指向它。

比如说,当我们执行下面代码时:

但是更深层次挖掘一下,我还需要知道创建函数对象的同时,还会创建一个“原型对象”,由函数对象的prototype属性指向这个原型对象。

2.对象原型

函数可以和以它为构造器所创建的所有对象共享原型对象。就比如本文最初展示的代码中,per01和per02都是Person函数创建的,那么per01或per02就可以通过自身的__proto__属性关联到Person对象的原型。

下图表示了它们之间的关系

所以既然函数的原型对象是可以为所有被创建对象共享的,那么就可以将我们要为所有对象都添加的属性添加到原型对象上。

二、原型链

在研究了对象原型和函数原型的关系后,我们还可以进一步深入思考:既然原型对象是一个“对象”,那么这个对象有没有__proto__这个属性呢?当然有!

但原型链并不是无止境的,到Object()函数为止。

var obj = {“myName”:”Jerry”,”myAge”:15};console.log(obj.__proto__.__proto__);
执行结果:null

三、原型的作用

JavaScript中原型有很广泛的用途,在此我们仅举两例,供大家参考。

1.格式化日期

在JavaScript中对日期格式化的支持不是很完善,需要我们自己弥补。但是用到日期格式化的地方又很多,这毕竟是个基础操作,那如何能够一劳永逸的解决这个问题呢?

①通过原型机制将格式化日期的函数添加到Date()函数对象上

代码如下:

// 对Date的扩展,将 Date 转化为指定格式的String// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,// 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)// 例子:// (new Date()).Format(“yyyy-MM-dd hh:mm:ss.S”) ==&> 2006-07-02 08:09:04.423// (new Date()).Format(“yyyy-M-d h:m:s.S”) ==&> 2006-7-2 8:9:4.18//var time1 = new Date().format(“yyyy-MM-dd HH:mm:ss”);////var time2 = new Date().format(“yyyy-MM-dd”);Date.prototype.Format = function(fmt) { // author: meizzvar o = {“M+” : this.getMonth() + 1, // 月份“d+” : this.getDate(), // 日“h+” : this.getHours(), // 小时“m+” : this.getMinutes(), // 分“s+” : this.getSeconds(), // 秒“q+” : Math.floor((this.getMonth() + 3) / 3), // 季度“S” : this.getMilliseconds()// 毫秒};if (/(y+)/.test(fmt))fmt = fmt.replace(RegExp.$1, (this.getFullYear() + “”).substr(4 – RegExp.$1.length));for ( var k in o)if (new RegExp(“(” + k + “)”).test(fmt))fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]): ((“00” + o[k]).substr((“” + o[k]).length)));return fmt;}

②将上述代码保存到js文件中

③使用时引入这个js 文件即可调用format()函数格式化日期

2.模拟继承

在JavaScript中没有类的概念,用于创建对象的构造器函数很类似于Java中的类。而面向对象中的很多思想在JavaScript中也只能模拟实现。

①情景举例

声明一个Person构造器函数和一个Student构造器函数。

function Person(theName,theAge){this.theName = theName;this.theAge = theAge;}function Student(theName,theAge,subject){this.theName = theName;this.theAge = theAge;this.subject;}

很明显,这两个函数从语义上来说存在着继承关系,学生是人的一种,Student对象应该是Person对象的实例。同时给姓名和年龄赋值的语句在两个函数中也是重复的。

所以模拟继承时我们需要解决两个问题:

i.将Student中的重复代码使用Person来代替

ii.让Student对象是Person的实例,即student instanceof Person要返回true

②提取重复代码

function Person(theName,theAge){this.theName = theName;this.theAge = theAge;}function Student(theName,theAge,subject){Person.apply(this, arguments);this.subject;}

③instanceof

function Person(theName,theAge){this.theName = theName;this.theAge = theAge;}function Student(theName,theAge,subject){Person.apply(this, arguments);this.subject;}Student.prototype = Person.prototype;var student = new Student(“Tom”, 20, “Java”);console.log(student);console.log(student instanceof Person);

那么这是为什么呢?在JavaScript中,判断一个对象是否是某个构造器函数的实例,就是看分别沿着对象和函数的原型链能否找到同一个原型对象。

例如:student对象为什么能够是Object的实例呢?

console.log(student instanceof Object); //trueconsole.log(student.__proto__.__proto__ === Object.prototype); //true

那么现在student.__proto__和Person.prototype相等,student自然就可以是Person的实例了。

“javascript原型链详解(js中原型和原型链)” 的相关文章

互联网创业项目有哪些,分享五种稳赚不赔的项目

互联网技术的迅猛发展使得足不出户你就可以遍知天下事,可以与朋友、客户、商家进行互动,给想要创业的你带来福音。那么当别人通过互联网创业赚得盆满钵盈的时候,你想过他...

miui8是什么软件(强制破解小米激活锁解决)

随着科技的不断发展,起初作为简单通讯工具的手机如今承载了更多的任务和使命。从功能机向智能机迈进的历程中,安卓和iOS成为了佼佼者。不过以开放、包容著称的安卓系统...

qq的截图快捷键怎么改(键盘截图快捷键分享)

说起电脑的截图方法,其实有很多,比如说QQ微信的软件截图、浏览器截图、电脑自带的截图以及一些专门的截图软件。用户可能也会根据自己的使用习惯有不同的偏好,如果之前...

seo先学什么,学seo必备的知识点

L氪迹答:首先,小编抛出自己的观点:学好SEO最重要的是自己去实践,SEO不是一门纸上谈兵的技术,只有自己动手去实践才会看到真正的效果,也才能真正收获一些经验。...

如何搭建邮件服务器,其实过程非常简单不会的朋友赶紧过

很多工作是人与人之间的沟通,一方面要高效方便,另一方面还要能够留存数据以便查询,更为重要的是数据最好能够有企业自己管控。免费邮箱固然可以实现人与人之间的沟通,但...

华为手机怎么关闭广告推送(屏蔽手机推送消息的方法)

相信很多人都深有同感,在使用手机的过程中,在通知栏每天都会有很多的推送消息。这是非常令人反感的,我们要怎样做才不会被这些资讯文、广告文所侵扰呢?接下来小编就传授...

qq怎么升级等级快,史上详细qq等级提升攻略

什么是QQ等级?很简单,鼠标我们的QQ头像,你所见的四种图标,太阳,月亮,星星,皇冠,在线天数不同我们的等级就不同。接下来大威找来了完整的QQ等级表,小伙伴们可...

博乐宝净水器怎么样(深度评测其产品质量与性能)

水质问题其实已经是老生常谈的话题了,而净水器就成了大多数人选择的一种方式,所有近几年净水器基本成了大多数家庭都会具备的居家产品,而如何在众多同类产品中选择最为合...

github如何上传代码到仓库(github提交代码步骤)

上传文件到github正常来说:1.先在自己的github上创建一个仓库并且需要配置好ssh公钥在用户目录打开git的bash,然后输入指令ssh-keygen...

千元机拍照哪个最强,四款千元手机拍照对比评测

谁是千元最强拍照?四款热门机型对比,差距真的很大一直以来,手机的拍照都是消费者非常关注的一个功能,而面对镜头传感器的不断升级,如今的千元机也跟上了后置双摄、三摄...