日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

JavaScript進階(四)原型與原型鏈用法實例分析

瀏覽:156日期:2023-10-29 09:49:38

本文實例講述了JavaScript原型與原型鏈用法。分享給大家供大家參考,具體如下:

一句話說明什么是原型:原型就是一個JavaScript對象,原型能存儲我們的方法,構造函數創建出來的實例對象能夠引用原型中的方法。

一、傳統構造函數的問題

有如下代碼

function Foo(){ this.sayHello = function(){ }}

由于對象是調用new Foo()所創建出來的,因此每一個對象在創建的時候,函數 sayHello 都會唄創建一次

那么有沒一個對象都含有一個獨立的,不同的,但是功能邏輯一樣的函數,比如:{} == {}。

在代碼中方法就會消耗性能,最典型的資源就越是內存

這里最好的方法就是將函數放在構造函數之外,那么在構造函數中引用該函數即可

function sayHello () {}function Foo () { this.say = sayHello;}

會在開發中變得困難:引入框架危險,代碼繁冗不好維護。解決方法就是如果外面的函數不占用其名字,而且在函數名下。

每一個函數在定義的時候,有一個神秘對象(就是原型對象,暫且這么稱呼)被創建出來。

每一個由構造函數創建的對象都會默認的連接到該神秘對象上。

var f1 = new Foo();var f2 = new Foo();f1.sayHello(); //如果f1沒有sayHello那么就會在Foo.prototype中去找

由構造函數創建出來的眾多對象共享一個對象就是:構造函數.prototype

只需要將共享的東西,重復會多占用內存的東西放到構造函數.prototype中,那么所有的對象就可以共享了。

function Foo(){}Foo.prototype.sayHello = function(){ console.log('….');}var f1 = new Foo();f1.sayHello();var f2 = new Foo();f2.sayHello();console.log(f1.sayHello === f2.sayHello); // true二、一些相關概念

類class:在JS中就是構造函數

在傳統的面向對象語言中,使用一個叫類的東西定義模板,然后使用模板創建對象。 在構造方法中也具有類似的功能,因此也稱其為類

實例(instance)與對象(object)

實例一般是指某一個構造函數創建出來的對象,我們稱為XXXX 構造函數的實例 實例就是對象。對象是一個泛稱 實例與對象是一個近義詞

鍵值對與屬性和方法

在JS中鍵值對的集合稱為對象 如果值為數據(非函數),就稱該鍵值對為屬性 如果值為函數(方法),就稱該鍵值對為方法method

父類與子類(基類和派生類)

傳統的面向對象語言中使用類來實現繼承那么就有父類、子類的概念 父類又稱為基類,子類又稱為派生類 在JS中沒有類的概念,在JS中常常稱為父對象,子對象,基對象,派生對象。三、認識原型

在JavaScript中,原型也是一個對象,通過原型可以實現對象的屬性繼承,JavaScript的對象中都包含了一個[[Prototype]]內部屬性,這個屬性所對應的就是該對象的原型。

[[Prototype]]作為對象的內部屬性,是不能被直接訪問的。所以為了方便查看一個對象的原型,Firefox和Chrome中提供了__proto__這個非標準(不是所有瀏覽器都支持)的訪問器(ECMA引入了標準對象原型訪問器'Object.getPrototype(object)')。

下面通過一個例子來看看原型相關概念:

function Person() {}// 神秘對象就是Person.prototype//那么只有使用構造函數才可以訪問它var o = new Person();//以前不能直接使用o來訪問神秘對象//現在有了__proto__后,o.__proto__也可以直接訪問神秘對象//那么o.__proto__ === Person.prototype

神秘對象(原型)中都有一個屬性constructor,翻譯為 構造器 。表示該原型是與什么構造函數聯系起來的。

__proto__有什么用?可以訪問原型。由于在開發中除非特殊要求,不要使用實例去修改原型的成員,因此該屬性開發時使用較少。但是在調試過程中非常方便,可以輕易的訪問原型進行查看成員

如果在早期的瀏覽器中使用實例需要訪問原型如何處理?可以使用實例對象訪問構造器,然后使用構造器訪問原型

var o = new Person();o.constructor.prototype

如果給實例繼承自原型的屬性賦值

function Foo();Foo.prototype.name = 'test';var o1 = new Foo();var o2 = new Foo();o1.name = '張三'; // 不是修改原型中的name而是自己增加了一個name屬性console.log(o1.name + ’,’+ o2.name); // 張三,test四、構造、原型、實例三角結構圖

對于如下代碼:

function Person(){}var p = new Person()console.log(Person.prototype.constructor); //function Person(){}console.log(Person.prototype.constructor.name); //Personconsole.log(typeof Person.prototype.constructor); //functionconsole.log(p.__prop__);console.log(p.__prop__ === Person.prototype);//true

于是他們的關系圖如下:

JavaScript進階(四)原型與原型鏈用法實例分析

五、對象的原型鏈

凡是對象就有原型,原型也是對象。因此凡是給定一個對象,那么就可以找到他的原型,原型還有原型,那么如此下去,就構成一個對象的序列,稱該結構為原型鏈。

問題:

原型鏈到底到什么時候是一個頭? 一個默認的原型鏈結構是怎樣的? 原型鏈結構對已知語法的修正5.1 原型鏈的結構

凡是使用構造函數,創建出對象,并且沒有利用賦值的方式修改原型,就說該對象保留默認的原型鏈。

默認原型鏈結構是什么樣子呢?

function Person(){}var p = new Person();//p 具有默認的原型鏈

默認的原型鏈結構就是:當前對象 -> 構造函數.prototype -> Object.prototype -> null

JavaScript進階(四)原型與原型鏈用法實例分析

在實現繼承的時候,有時候會利用替換原型鏈結構的方式實現原型繼承,那么原型鏈結構就會發送改變

function DunizbCollection(){}DunizbCollection.prototype = [];var arr = new DunizbCollection();// arr -> [] -> Array.prototype -> Object.prototype -> null

JavaScript進階(四)原型與原型鏈用法實例分析

六、函數的構造函數Function

在JS中使用Function可以實例化函數對象 。也就是說在JS中函數與普通對象一樣,也是一個對象類型。函數是JS中的一等公民。

函數是對象,就可以使用對象的動態特性 函數是對象,就有構造函數創建函數 函數是對象,可以創建其它對象 函數是唯一可以限定變量作用域的結果

要解決的問題

Function 如何使用 Function 與函數的關系 函數的原型鏈結構6.1 函數是Function的實例

語法

new Function( arg0,arg1,arg1,….argN, body );

Function 中的參數全部是字符串

該構造函數的作用是將參數鏈接起來組成函數

如果參數只有一個,那么表示函數體 如果參數有多個,最后一個參數表示函數體,前面的所有參數表示函數的參數 如果沒有參數,表示創建一個空函數

舉例:創建一個打印一句話的函數

// 傳統的function foo () { console.log( ’你好’ );}//Functionvar func = new Function( ’console.log( '你好' );’ );// 功能上,這里foo 與 func 等價

再比如,創建一個空函數

//傳統function foo () {}//Functionvar func = new Function();func();

傳入函數內一個數字,打印該函數

//傳統function foo ( num ) { console.log( num );}//Functionvar func = new Function( 'num' ,'console.log( num )' );func();6.2 函數的原型鏈結構

任意的一個函數,都是相當于Function的實例,類似于{}與new Object()的關系。

function foo () {}

上面的代告訴解析器,有一個對象叫foo,它是一個函數;相當于new Function()得到一個函數對象

函數應該有什么屬性?答:__proto__ 函數的構造函數是什么?答:Function 函數應該繼承自Function.prototype Function.prototype繼承自Object.prototype

對于Function,我們還必須知道

Object函數是Function的一個實例

Object作為對象是繼承自Function.prototype的,又“Function.prototype”繼承自Object.prototype

foo.prototype.__proto__ === Object.prototype // true Function是自己的構造函數 在JS 中任何對象的老祖宗就是Object.prototype 在JS中任何函數的老祖宗就是Function.prototype

下面繪制出 Function 的構造原型實例三角形結構

JavaScript進階(四)原型與原型鏈用法實例分析

6.3 為什么要使用Function?

Function是使用字符串構建函數,那么就可以在程序運行過程中構建函數.

以前的函數必須一開始就寫好,再經過預解析,一步一步的運行

假定從服務器里拿到“[1,2,3,4,5]”,將數組形式的字符串轉換成數組對象

var arr = ( new Function( ’return ’ + str + ’ ;’ ) )();

感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運行工具:http://tools.jb51.net/code/HtmlJsRun測試上述代碼運行效果。

更多關于JavaScript相關內容可查看本站專題:《JavaScript常用函數技巧匯總》、《javascript面向對象入門教程》、《JavaScript錯誤與調試技巧總結》、《JavaScript數據結構與算法技巧總結》及《JavaScript數學運算用法總結》

希望本文所述對大家JavaScript程序設計有所幫助。

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
夜久久久久久| 国产精品调教视频| 久久久久91| 欧美二区视频| 亚洲色图国产| 免费一级欧美片在线观看网站| 三上亚洲一区二区| 中文亚洲免费| 国产精品久久亚洲不卡| 久久久天天操| 日韩av影院| 六月婷婷综合| 亚洲三级av| 国产福利片在线观看| 亚洲一区二区三区高清不卡| 久久精品99国产国产精| 一本大道色婷婷在线| 午夜亚洲一区| 国产精品mm| 美女久久久久| 国产精品一区二区精品| 久久精品影视| 欧美在线黄色| 亚洲成人va| 日本中文字幕不卡| 亚洲www啪成人一区二区| 亚洲精品在线a| 日韩一区二区三区免费播放| 久色成人在线| 日本一二区不卡| 亚洲男人在线| 久久久久久美女精品| 日韩三级精品| 久久九九精品| 国产精品tv| 一区二区国产在线观看| 捆绑调教日本一区二区三区| 中文字幕一区二区av| 98精品久久久久久久| 亚洲永久精品唐人导航网址| 日本不卡一二三区黄网| 国产精品日韩精品在线播放| 国产精品嫩草99av在线| 国产乱码精品一区二区三区亚洲人| 日韩精品一页| 久久久久久久久成人| 激情黄产视频在线免费观看| 好吊日精品视频| 久久精品国产亚洲一区二区三区| 99国内精品| 国产成人精选| 日韩美女国产精品| 免费av一区| 超碰在线99| 久久国产生活片100| 夜久久久久久| 日韩一区亚洲二区| 亚洲一区二区三区高清不卡| 欧美13videosex性极品| 国产亚洲字幕| 亚洲一区区二区| 成人在线网站| 国产精品magnet| 亚洲tv在线| 国产视频一区在线观看一区免费| 国产成人1区| 国产精品久久久久久久久久白浆 | 国产精品麻豆久久| 亚洲精品婷婷| 9久re热视频在线精品| 日韩在线综合| 精品一区二区三区中文字幕 | 婷婷成人av| 婷婷成人基地| 日本高清不卡一区二区三区视频| 日韩高清在线不卡| 老色鬼久久亚洲一区二区| 999国产精品视频| 丝袜诱惑一区二区| 国产成人久久精品一区二区三区| 国产精品久久久久久久久免费高清 | 欧美福利在线| 欧美福利专区| 日韩av一二三| 99视频在线精品国自产拍免费观看| 国产精品www994| 久久久久一区| 久久久久.com| 国产亚洲一区二区三区不卡| 亚洲激情精品| 亚洲va中文在线播放免费| 国产精品一区高清| 亚洲精品无播放器在线播放| 久久久一本精品| 欧美成人一二区| 色8久久久久| 日韩一区二区免费看| а√在线中文在线新版| 久久精品72免费观看| 免费人成网站在线观看欧美高清| 九九色在线视频| 成人免费电影网址| 丝袜美腿诱惑一区二区三区| 91精品韩国| 国产在线成人| 国产精品婷婷| 日韩**一区毛片| 国产精品白浆| 久久精品福利| 色偷偷色偷偷色偷偷在线视频| 亚洲精品88| 亚洲福利国产| 福利精品一区| 色在线中文字幕| 91九色精品国产一区二区| 日韩在线a电影| 国产午夜久久av| 国内精品麻豆美女在线播放视频| 国产自产自拍视频在线观看| 久久久久久黄| 香蕉视频成人在线观看| 另类国产ts人妖高潮视频| 亚洲欧美在线综合| 国产精品丝袜在线播放| 日韩1区在线| 日韩午夜av在线| 日本在线一区二区三区| 久久的色偷偷| 91精品国产乱码久久久久久久 | 国产精品欧美在线观看| 开心激情综合| 久久精品国内一区二区三区水蜜桃| 在线亚洲免费| 亚洲日本在线观看视频| 国产精品视频一区二区三区四蜜臂 | 亚洲自拍另类| 欧美一区网站| 日韩久久视频| 亚洲网址在线观看| 精品国产欧美| av亚洲在线观看| 日韩影片在线观看| 欧美精品1区| 久久国产日本精品| 亚洲视频国产| 精品国产不卡| 婷婷成人基地| 国产亚洲高清在线观看| 日韩不卡视频在线观看| 蜜臀va亚洲va欧美va天堂| 久久不见久久见国语| 亚洲午夜电影| 国产日产一区| 午夜电影亚洲| 国产精品www.| 日韩天堂av| 久久久91麻豆精品国产一区| 久久久久久久久久久9不雅视频| 亚洲精品伊人| 伊人久久在线| 欧美日韩精品一区二区三区视频 | 99国产精品久久久久久久| 91久久精品无嫩草影院| 国产成人免费精品| 综合亚洲视频| 一区二区三区四区日本视频| 中文字幕一区日韩精品| av在线最新| 日本欧美韩国一区三区| 啪啪国产精品| 国产乱子精品一区二区在线观看| 欧美中文字幕一区二区| 国产精品一区二区精品视频观看 | 91精品国产自产观看在线| 亚洲精品一级二级| 青青草91久久久久久久久| 99久精品视频在线观看视频| 97成人超碰| 在线 亚洲欧美在线综合一区| 久久av免费| 亚洲在线电影| 亲子伦视频一区二区三区| 国产日韩一区二区三区在线播放| 久久久一二三| 麻豆久久久久久久| 亚洲三级精品| 黄色日韩在线| 香蕉成人av| 成人午夜在线| 国产精品黄色| 免费在线看一区| 蜜桃国内精品久久久久软件9| 毛片不卡一区二区| 日韩一区二区三区高清在线观看| 欧美.日韩.国产.一区.二区| 日韩一区电影| 日韩高清在线观看一区二区| 日韩电影免费网址| 日韩av午夜在线观看| 黄毛片在线观看|