新闻资讯  快讯  焦点  财经  政策  社会
互 联 网   电商  金融  数据  计算  技巧
生活百科  科技  职场  健康  法律  汽车
手机百科  知识  软件  修理  测评  微信
软件技术  应用  系统  图像  视频  经验
硬件技术  知识  技术  测评  选购  维修
网络技术  硬件  软件  设置  安全  技术
程序开发  语言  移动  数据  开源  百科
安全防护  资讯  黑客  木马  病毒  移动
站长技术  搜索  SEO  推广  媒体  移动
财经百科  股票  知识  理财  财务  金融
教育考试  育儿  小学  高考  考研  留学
您当前的位置:首页 > IT百科 > 程序开发 > 语言 > javascript

JavaScript原型详解

时间:2019-12-03 16:54:08  来源:  作者:

1,前言

下面是2008年Github创建以来,各种编程语言的排名情况

JavaScript原型详解

 

排名

其中JAVAScript自2013年之后就盘踞第一名,成为github上被使用最多的语言,早期,JS的使用还主要集中于浏览器中,但是随着node.js进军服务器开发和React Native逐渐向移动端渗透,一个属于JS的全栈时代就要来临了。而且JS界还流传一句名言:“所有能用JS开发的应用程序,最终都会用JS来开发”。我就问你怕不怕?好了,说了这么多,我并不是想说JS为世界上最好的语言(显然php才是,对吧?←_←),也不是觉得JS会替代谁,我只是觉得,JavaScript将会是一个大家(不止web端)都应该了解和学习的语言工具。

2,面对对象(OOP)

2.1 实现思路

面对对象是大家都很熟悉的程序设计思想,是对真实世界的抽象,目前主要OOP语言用来实现面对对象的基础是类,通过类的封装,继承来映射真实世界。包括Java,C#,甚至是Python等都通过类的设计来实现面对对象。但是细想起来也会觉得有问题,因为真实世界其实没有类这种概念,只有一个个不同的对象,真实世界中,继承关系发生在对象和对象之间,而不是类。就比如孩子是对象,父母也是对象,孩子(对象)继承自父母(对象)

JS也是面对对象的编程语言,只不过它实现面对对象的思路是基于原型(prototype),而不是类。这种思路也叫对象关联(Object Link Other Object),即在对象上直接映射那种真实世界的关系(如继承)。

2.2 原型概念

相关的概念其实我研究了好几天,除开原型概念本身,与之联系的对象的产生,构造函数,proto,prototype的区别,为什么对象没有prototype这个指向原型的属性,而是使用proto来指向原型?

好,我们先来谈谈原型这个概念。JS中一切皆对象,而每个对象都有一个原型(Object除外),这个原型,大概就像Java中的父类,所以,基本上你可以认为原型就是这个对象的父对象,即每一个对象(Object除外)内部都保存了它自己的父对象,这个父对象就是原型。一般创建的对象如果没有特别指定原型,那么它的原型就是Object(这就很类似Java中所有的类默认继承自Object类)。

2.3 对象创建

在JS中,对象创建的方法有很多种,最常见的如下:

//第一种,手动创建
var a={'name':'lala'}; 
//第二种,构造函数
function A(){
 this.name='lala';
}
var a=new A();
//第三种,class (ES6标准写法)
class A{
 constructor(){
 //super();此处没有使用extends显式继承,不可使用super()
 this.name='lala';
 }
}
var a=new A()
//其实后面两种方法本质上是一种写法复制代码

这三种写法创建的对象的原型(父对象)都是Object,需要提到的是,ES6通过引入class ,extends等关键字,以一种语法糖的形式把构造函数包装成类的概念,更便于大家理解。是希望开发者不再花精力去关注原型以及原型链,也充分说明原型的设计意图和类是一样的。

2.3 查看对象原型

当对象被创建之后,查看它们的原型的方法不止一种,以前一般使用对象的proto属性,ES6推出后,推荐用Object.getPrototypeOf()方法来获取对象的原型

function A(){
 this.name='lala';
}
var a=new A();
console.log(a.__proto__) 
//输出:Object {}
//推荐使用这种方式获取对象的原型
console.log(Object.getPrototypeOf(a)) 
//输出:Object {}复制代码

无论对象是如何创建的,默认原型都是Object,在这里需要提及的比较特殊的一点就是,通过构造函数来创建对象,函数A本身也是一个对象,而A有两个指向表示原型的属性,分别是proto和prototype,而且两个属性并不相同

function A(){
 this.name='lala';
}
var a=new A();
console.log(A.prototype) 
//输出:Object {}
console.log(A.__proto__) 
//输出:function () {}
console.log(Object.getPrototypeOf(A))
//输出:function () {}复制代码

函数的的prototype属性只有在当作构造函数创建的时候,把自身的prototype属性值赋给对象的原型。而实际上,作为函数本身,它的原型应该是function对象,然后function对象的原型才是Object。

总之,建议使用ES6推荐的查看原型和设置原型的方法。

2.4 原型的用法

其实原型和类的继承的用法是一致的:当你想用某个对象的属性时,将当前对象的原型指向该对象,你就拥有了该对象的使用权了。

function A(){
 this.name='world ';
}
function B(){
 this.bb="hello"
 }
var a=new A();
var b=new B();
Object.setPrototypeOf(a,b);
//将b设置为a的原型,此处有一个问题,即a的constructor也指向了B构造函数,可能需要纠正
a.constructor=A;
console.log(a.bb)
//输出 hello复制代码

(增补)

如果使用ES6来做的话则简单许多,甚至不涉及到prototype这个属性

class B{
 constructor(){
 this.bb='hello'
 }
}
class A extends B{
 constructor(){
 super()
 this.name='world'
 }
}
var a=new A();
console.log(a.bb+" "+a.name);
//输出hello world
console.log(typeof(A))
//输出 "function"复制代码

怎么样?是不是已经完全看不到原型的影子了?活脱脱就是类继承,但是你也看得到实际上类A 的类型是function,所以说,本质上class在JS中是一种语法糖,JS继承的本质依然是原型,不过,ES6引入class,extends 来掩盖原型的概念也是一个很友好的举动,对于长期学习那些类继承为基础的面对对象编程语言的程序员而言。

我的建议是,尽可能理解原型,尽可能用class这种语法糖。


2.5 原型链

这个概念其实也变得比较简单,可以类比类的继承链条,即每个对象的原型往上追溯,一直到Object为止,这组成了一个链条,将其中的对象串联起来,当查找当前对象的属性时,如果没找到,就会沿着这个链条去查找,一直到Object,如果还没发现,就会报undefined。那么也就意味着你的原型链不能太长,否则会出现效率问题。

3,总结

  • 对于原型概念的理解
  • 类比类的继承,对象的原型可以理解为对象的父对象
  • 原型的运用
  • 尽可能使用ES6的标准,使用class,extends,Object.getPrototype(),Object.setPrototype()等等
  • 需要注意的点
  • 原型继承链条不要太长
  • 指定原型时,注意constructor也会改变。

4,后记(增补)

还有人觉得我的分析很抽象,所以,我再总结一下,如果要一句话理解JS中的原型是什么,那就是,对象的原型就指的对象的父对象。每个对象都有父对象,父对象本身也有父对象(爷对象?)。而原型链呢,很像过去家谱的概念,可以从你往上追溯你父亲,到爷爷,到太爷爷一直到头,这就形成了一个链条,如果其中每个人都比作一个对象,那么这个链条就是原型链。



Tags:JavaScript   点击:()  评论:()
声明:本站部分内容来自互联网,内容观点仅代表作者本人,如有任何版权侵犯请与我们联系,我们将立即删除。
▌相关评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
▌相关推荐
1,前言下面是2008年Github创建以来,各种编程语言的排名情况 排名其中JavaScript自2013年之后就盘踞第一名,成为github上被使用最多的语言,早期,JS的使用还主要集中于浏览器中,但是...【详细内容】
2019-12-03   JavaScript  点击:(0)  评论:(0)  加入收藏
多年来,业界已经发布了大量 JavaScript 框架,怎样进行选择可能是一个挑战。如果你感到困惑,不知道应该选哪个或者究竟哪个适合你,那么我已经帮你解决了问题。在本文中,我将列出用...【详细内容】
2019-12-02   JavaScript  点击:(1)  评论:(0)  加入收藏
JavasScript 特性本章简要回顾我们到现在为止学到的 JavaScript 特性,并特别注意了一些细节。代码结构语句用分号分隔:alert('Hello'); alert('World');通...【详细内容】
2019-11-29   JavaScript  点击:(7)  评论:(0)  加入收藏
笔试面试经常涉及各种算法,本文简要介绍常用的一些算法,并用JavaScript实现。1、插入排序1)算法简介插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原...【详细内容】
2019-11-22   JavaScript  点击:(8)  评论:(0)  加入收藏
前端日常开发中,我们使用喜爱的 IDE 调试 JavaScript 代码,比如我喜欢的代码编辑器有两个,Sublime Text 3 和 VS Code,前几年还使用过 Atom,偶尔我们会遇到临时需要快速分享给同...【详细内容】
2019-11-14   JavaScript  点击:(12)  评论:(0)  加入收藏
目录: 第一部分:数组 第二部分:函数 第三部分:字符串 第四部分:对象 第五部分:数字 第六部分:浏览器操作及其它1. 第一部分:数组1. `all`:布尔全等判断const all = (arr, fn = Boole...【详细内容】
2019-11-12   JavaScript  点击:(12)  评论:(0)  加入收藏
Promise 是 CommonJS 中的规范,它能够帮助我们控制代码流程,避免函数的多层嵌套。现在 Web 前端异步编程越来越普遍,它的出现让异步编程变得更佳的容易理解。由于它越来越受到...【详细内容】
2019-11-11   JavaScript  点击:(12)  评论:(0)  加入收藏
1. 内容概要本文主要讨论以下两个问题: JavaScript 的位运算:先简单回顾下位运算,平时用的少,相信不少人和我一样忘的差不多了 权限设计:根据位运算的特点,设计一个权限系统(添加、...【详细内容】
2019-11-07   JavaScript  点击:(12)  评论:(0)  加入收藏
先看一道面试题 让 a==1&&a==2&&a==3,这个问题主要查看对js隐式转换的理解,首先a不可能是一个原始类型,那么a只有可能是个对象类型了,查阅犀牛书52页《3.8.3对象转换为原始值...【详细内容】
2019-11-06   JavaScript  点击:(7)  评论:(0)  加入收藏
浏览器是如何解析JavaScript的?本篇文章就来带大家认识浏览器解析JavaScript的原理,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。【推荐视频教程:JavaScript视...【详细内容】
2019-11-04   JavaScript  点击:(8)  评论:(0)  加入收藏
在业务开发中经常会用到JavaScript内置对象提供的函数,可以很方便的实现想要的需求,对于这些功能我们也能手动实现,这样可以更深入的了解其工作原理call函数call属于Function原...【详细内容】
2019-11-04   JavaScript  点击:(11)  评论:(0)  加入收藏
许多制作网页的朋友常常制作公告板、信息窗,也经常为了实现整版页面和图像的滚屏显示而烦恼,不用着急,这里有一个简单的方法来实现滚屏显示。我们没有采用Java的.class程序来...【详细内容】
2019-11-01   JavaScript  点击:(17)  评论:(0)  加入收藏
一、浏览器对象navigator 浏览器对象,如版本和名称。注:目前来说应该还没有应用于 navigator 对象的公开标准,不过所有浏览器都支持该对象。navigator 所拥有的对象属性1、appN...【详细内容】
2019-10-31   JavaScript  点击:(8)  评论:(0)  加入收藏
算法与数据结构构成了程序,数据结构用于实现数据的表示、存储、管理,算法通过使用数据完成一定的业务逻辑与操作,最终实现了程序的功能。因此算法在编程中的重要性是不言而喻的...【详细内容】
2019-10-30   JavaScript  点击:(7)  评论:(0)  加入收藏
这个小分享呢,道哥给大家分享一下使用率灰常灰常灰常高的数学函数Math,既然是数学函数那么肯定就离不开计算,那么我们接下来看一下它究竟是什么 主要干什么用已知变量如下定义v...【详细内容】
2019-10-30   JavaScript  点击:(12)  评论:(0)  加入收藏
如今,JavaScript非常流行,它非常灵活,被GitHub评为世界上最常用的编程语言。JavaScript在Web开发中占据了主导地位,大约有95%的网站都或多或少地使用了该语言。...【详细内容】
2019-10-30   JavaScript  点击:(10)  评论:(0)  加入收藏
例子一 :点击每一个li,显示对应li中数据<ul id="uls"> <li>111</li> <li>222</li> <li>333</li> <li>444</li></ul>//jq写法$("ul li").each(function(){ $(this).click(funct...【详细内容】
2019-10-29   JavaScript  点击:(12)  评论:(0)  加入收藏
在网页上呢大家经常可以看到有当天日期啊 时间啊等等,那么这些数据都是从哪里来的呢,今天道哥就给大家分享一下再javascript中的日期是怎么一回事。特简单,道哥的每一个小分享...【详细内容】
2019-10-25   JavaScript  点击:(13)  评论:(0)  加入收藏
一、什么是跨域?在日常开发过程中,经常要处理一些跨域问题,那么在了解跨域之前,首先要知道什么是同源策略(same-origin policy)。简单来讲同源策略就是浏览器为了保证用户信息的...【详细内容】
2019-10-25   JavaScript  点击:(23)  评论:(0)  加入收藏
定义:argument是一个伪数组对象,它表示在函数调用的过程传入的所有参数的集合*在函数调用过程中没有规定参数的个数与类型,因此函数调用就具有灵活的特性,那么为了方便使用,*在每...【详细内容】
2019-10-22   JavaScript  点击:(11)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条