电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

JavaScript原型詳解

瀏覽:3日期:2023-11-17 09:33:17
1,前言

下面是2008年Github創建以來,各種編程語言的排名情況

JavaScript原型詳解

其中JavaScript自2015年之后就盤踞第一名,成為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();this.name='lala'; }}var a=new A()//其實后面兩種方法本質上是一種寫法

這三種寫法創建的對象的原型(父對象)都是Object,需要提到的是,ES6通過引入class ,extends等關鍵字,以一種語法糖的形式把構造函數包裝成類的概念,更便于大家理解。是希望開發者不再花精力去關注原型以及原型鏈,也充分說明原型的設計意圖和類是一樣的。

2.4 查看對象原型

當對象被創建之后,查看它們的原型的方法不止一種,以前一般使用對象的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.5 原型的用法

其實原型和類的繼承的用法是一致的:當你想用某個對象的屬性時,將當前對象的原型指向該對象,你就擁有了該對象的使用權了。

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 worldconsole.log(typeof(A))//輸出 "function"

怎么樣?是不是已經完全看不到原型的影子了?活脫脫就是類繼承,但是你也看得到實際上類A 的類型是function,所以說,本質上class在JS中是一種語法糖,JS繼承的本質依然是原型,不過,ES6引入class,extends 來掩蓋原型的概念也是一個很友好的舉動,對于長期學習那些類繼承為基礎的面對對象編程語言的程序員而言。

我的建議是,盡可能理解原型,盡可能用class這種語法糖。

2.6 原型鏈

這個概念其實也變得比較簡單,可以類比類的繼承鏈條,即每個對象的原型往上追溯,一直到Object為止,這組成了一個鏈條,將其中的對象串聯起來,當查找當前對象的屬性時,如果沒找到,就會沿著這個鏈條去查找,一直到Object,如果還沒發現,就會報undefined。那么也就意味著你的原型鏈不能太長,否則會出現效率問題。

3,總結對于原型概念的理解類比類的繼承,對象的原型可以理解為對象的父對象原型的運用盡可能使用ES6的標準,使用class,extends,Object.getPrototype(),Object.setPrototype()等等需要注意的點原型繼承鏈條不要太長指定原型時,注意constructor也會改變。4,后記(增補)

還有人覺得我的分析很抽象,所以,我再總結一下,如果要一句話理解JS中的原型是什么,那就是,對象的原型就指的對象的父對象。每個對象都有父對象,父對象本身也有父對象(爺對象?)。而原型鏈呢,很像過去家譜的概念,可以從你往上追溯你父親,到爺爺,到太爺爺一直到頭,這就形成了一個鏈條,如果其中每個人都比作一個對象,那么這個鏈條就是原型鏈。

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 高考志愿规划师_高考规划师_高考培训师_高报师_升学规划师_高考志愿规划师培训认证机构「向阳生涯」 | 北京浩云律师事务所-法律顾问_企业法务_律师顾问_公司顾问 | 楼承板设备-楼承板成型机-免浇筑楼承板机器厂家-捡来 | 不干胶标签-不干胶贴纸-不干胶标签定制-不干胶标签印刷厂-弗雷曼纸业(苏州)有限公司 | 苏州教学设备-化工教学设备-环境工程教学模型|同科教仪 | 预制围墙_工程预制围墙_天津市瑞通建筑材料有限公司 | 坏男孩影院-提供最新电影_动漫_综艺_电视剧_迅雷免费电影最新观看 | 大数据营销公司_舆情监测软件_上海SEO公司-文军营销官网 | 玉米深加工设备|玉米加工机械|玉米加工设备|玉米深加工机械-河南成立粮油机械有限公司 | 西安烟道厂家_排气道厂家_包立管厂家「陕西西安」推荐西安天宇烟道 | 拉卡拉POS机官网 - 官方直营POS机办理|在线免费领取 | 金属检测机_金属分离器_检针验针机_食品药品金属检探测仪器-广东善安科技 | 江苏全风,高压风机,全风环保风机,全风环形高压风机,防爆高压风机厂家-江苏全风环保科技有限公司(官网) | 油罐车_加油机_加油卷盘_加油机卷盘_罐车人孔盖_各类球阀_海底阀等车用配件厂家-湖北华特专用设备有限公司 | 温湿度记录纸_圆盘_横河记录纸|霍尼韦尔记录仪-广州汤米斯机电设备有限公司 | 过跨车_过跨电瓶车_过跨转运车_横移电动平车_厂区转运车_无轨转运车 | 深圳律师咨询_深圳律师事务所_华荣【免费在线法律咨询】网 | 杜康白酒加盟_杜康酒代理_杜康酒招商加盟官网_杜康酒厂加盟总代理—杜康酒神全国运营中心 | 阻燃剂-氢氧化镁-氢氧化铝-沥青阻燃剂-合肥皖燃新材料 | 上海阳光泵业制造有限公司 -【官方网站】 | 兰州牛肉面加盟,兰州牛肉拉面加盟-京穆兰牛肉面 | 南溪在线-南溪招聘找工作、找房子、找对象,南溪综合生活信息门户! | 低噪声电流前置放大器-SR570电流前置放大器-深圳市嘉士达精密仪器有限公司 | 江苏皓越真空设备有限公司| 根系分析仪,大米外观品质检测仪,考种仪,藻类鉴定计数仪,叶面积仪,菌落计数仪,抑菌圈测量仪,抗生素效价测定仪,植物表型仪,冠层分析仪-杭州万深检测仪器网 | 盘扣式脚手架-附着式升降脚手架-移动脚手架,专ye承包服务商 - 苏州安踏脚手架工程有限公司 | 安徽合肥项目申报咨询公司_安徽合肥高新企业项目申报_安徽省科技项目申报代理 | 电表箱-浙江迈峰电力设备有限公司-电表箱专业制造商 | 真空包装机-诸城市坤泰食品机械有限公司 | 微波消解仪器_智能微波消解仪报价_高压微波消解仪厂家_那艾 | 流量检测仪-气密性检测装置-密封性试验仪-东莞市奥图自动化科技有限公司 | 根系分析仪,大米外观品质检测仪,考种仪,藻类鉴定计数仪,叶面积仪,菌落计数仪,抑菌圈测量仪,抗生素效价测定仪,植物表型仪,冠层分析仪-杭州万深检测仪器网 | 不锈钢闸阀_球阀_蝶阀_止回阀_调节阀_截止阀-可拉伐阀门(上海)有限公司 | 武汉刮刮奖_刮刮卡印刷厂_为企业提供门票印刷_武汉合格证印刷_现金劵代金券印刷制作 - 武汉泽雅印刷有限公司 | 电气控制系统集成商-PLC控制柜变频控制柜-非标自动化定制-电气控制柜成套-NIDEC CT变频器-威肯自动化控制 | 湿地保护| 冷热冲击试验箱_温度冲击试验箱价格_冷热冲击箱排名_林频厂家 | UV固化机_UVLED光固化机_UV干燥机生产厂家-上海冠顶公司专业生产UV固化机设备 | 珠海冷却塔降噪维修_冷却塔改造报价_凉水塔风机维修厂家- 广东康明节能空调有限公司 | 青海电动密集架_智能密集架_密集架价格-盛隆柜业青海档案密集架厂家 | AGV无人叉车_激光叉车AGV_仓储AGV小车_AGV无人搬运车-南昌IKV机器人有限公司[官网] |