亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > WEB開發 > 正文

javascript基礎--對象(Object)封裝

2024-04-27 15:03:36
字體:
來源:轉載
供稿:網友

引言

說到對象,我想到一個成語叫作談虎色變,對象應該說是javascript中最難得一部分,原因呢,首先,js作為函數式編程語言,對象的實現方式跟java,c,c++等面向對象設計語言不一樣;其次js面向對象編程屬于高級程序員應該掌握的,對于初學者來講,沒有實踐基礎,憑空理解更是難上加難。不過不用擔心,我也不怎么會,我們就一起來探討一下吧。

1.對象封裝

我們舉個例子,大千世界,人心難測。每個人都是獨立的,有自己的思維,性別,年齡,會跑,會跳等等,人就是一個單位,一個整體,然后人與人之間才會有血緣關系,社會關系。試想,一個人都不完整,還談什么其他東西呢?所以我們的首先任務就是“造人”,造人的方式的有很多種,當然肯定不是你想的那種,哈哈!好,接下來,開始造人吧!

2.封裝模式一:工廠模式

工廠模式的原理:在函數內部創建object對象,對象屬性由參數指定,方法也掛在object對象上,最后返回這個object對象。相當于Person函數是一個造人工廠,一下子造了Tom,Linda兩個人。但是缺點是不知道這兩個人什么類型的,你會說都是object啊,對啊,你回答這個答案就像我問你你現在在哪?你說你在地球上一樣的道理。我們應該知道,js里所有事物都是object類型,所以為了搞明白這兩個人具體的類型,我們另有他法,那就是構造函數模式。

function Person(name,sex){ var o = new Object(); o.name = name; o.sex = sex; o.say = function(){ console.log(this.name + ' is '+ this.sex) }; return o;}var Tom = Person('Tom','male');var Linda = Person('Linda','female');

3.封裝模式二:構造函數模式

構造函數模式相比工廠函數就是知道Tom和Linda這兩個人是Person類型,原理是new關鍵字默認執行了以下操作: 1.創建一個全新的對象 2.這個對象會被執行[[PRototype]]連接原型 3.函數調用中的this會綁定到新對象 4.如果函數沒有返回其他對象,那么new 構造就會自動返回這個新對象 注意:這里我特意加粗這句話,因為文末講的寄生構函數模式的理解需要仰仗這句話。先透個底,如果函數像工廠函數那樣返回了對象,那么new關鍵詞也就不會執行默認操作。

function Person(name,sex){ this.name = name; this.sex = sex; this.say = function(){ console.log(this.name + ' is '+ this.sex); }}var Tom = new Person('Tom','male');var Linda = new Person('Linda','female');

上述的原型鏈圖示為: 這里寫圖片描述

Person.prototype指向原型對象,而原型對象的constructor屬性指向構造函數Person,Tom和Linda實例繼承了原型對象的constructor屬性,所以有下面的等式

console.log(Tom.constructor === Person.prototype.constructor && Tom.constructor === Person);//tureconsole.log(Linda.constructor === Person.prototype.constructor && Linda.constructor === Person);//ture

Javascript還提供了instanceof,驗證實例與構造函數的關系

console.log(Tom instanceof Person);//trueconsole.log(Linda instanceof Person);//true

4.封裝模式三:原型模式

構造函數有個弊端,就是每一次new一個對象的時候,其實都創建了各自的屬性和方法,這些屬性和方法是重復的,完全沒必要嘛,代碼量多,又浪費內存。原型模式解決了這個問題,將公用方法和不變的屬性掛在原型對象上。

//構造函數模式new的實例,相同的屬性和方法是不一致的,驗證一下console.log(Tom.name === Linda.name);//falseconsole.log(Tom.sex === Linda.sex);//falseconsole.log(Tom.say === Linda.say);//false//不對就對了,下面是原型模式function Person(){}Person.prototype.name = 'Tom';Person.prototype.sex = 'male';Person.prototype.say = function(){ console.log(this.name + ' is '+ this.sex);};var Tom = new Person();var Linda = new Person();

原型鏈圖示為: 這里寫圖片描述

實例屬性或方法的訪問過程是一次搜索過程: 1.首先從對象實例本身開始,如果找到屬性就直接返回該屬性值; 2.如果實例本身不存在要查找屬性,就繼續搜索指針指向的原型對象,在其中查找給定名字的屬性,如果有就返回; 基于以上分析,原型模式創建的對象實例,其屬性是共享原型對象的;但也可以自己實例中再進行定義,在查找時,就不從原型對象獲取,而是根據搜索原則,得到本實例的返回;簡單來說,就是實例中屬性會屏蔽原型對象中的屬性;

接下來看一下這些屬性和方法相等嗎?

console.log(Tom.name === Linda.name);//trueconsole.log(Tom.sex === Linda.sex);//trueconsole.log(Tom.say === Linda.say);//true

javascript提供一些驗證實例和原型對象關系的方法

//isPrototypeOf用來判斷,某個原型對象和某個實例之間的關系console.log(Person.prototype.isPrototypeOf(Tom)); //trueconsole.log(Person.prototype.isPrototypeOf(Linda)); //true//hasOwnProperty()方法,用來判斷某一個屬性到底是本地屬性,還是繼承自prototype對象的屬性console.log(Tom.hasOwnProperty("name")); // falseconsole.log(Linda.hasOwnProperty("name")); // false//in運算符可以用來判斷,某個實例是否含有某個屬性,不管是不是本地屬性console.log("name" in Tom); // trueconsole.log("name" in Linda); // true

5.封裝模式四:組合構造函數及原型模式

簡稱組合模式,構造函數實例好比私有制,原型模式實例好比公有制,那么組合模式就是以公有制為核心,私有制并行的模式,佩服我歷史學得真好!所以自己的屬性就不要掛在原型對象上,只有共有屬性和方法才掛在上面。

function Person(name,sex){ this.name = name; this.sex = sex;}Person.prototype = { //原型字面量方式會將對象的constructor變為Object,此外強制指回Person constructor: Person, say: function(){ console.log(this.name + ' is '+ this.sex); }}var Tom = new Person('Tom','male');var Linda = new Person('Linda','female');

原型鏈示圖:

這里寫圖片描述

做些測試吧!

console.log(Tom.name);//Tomconsole.log(Linda.name);//Lindaconsole.log(Tom.say === Linda.say);//true

6.封裝模式五:動態原型模式

組合模式私有屬性和共有屬性及方法是分離的,如果能夠放在一個構造函數里,那就真的和對象相差無幾了。

function Person(name,sex){ this.name = name; this.sex = sex; if(typeof this.say != 'function'){ Person.prototype = { constructor: Person, say: function(){ console.log(this.name + ' is '+ this.sex); } } }}var Tom = new Person('Tom','male');var Linda = new Person('Linda','female');

來驗證一下吧!

console.log(Tom.name);//Tomconsole.log(Linda.name);//Linda//===>想想為什么第一個Tom.say返回undefined?我似懂非懂Tom.say;//undefinedLinda.say;//function

7.封裝模式六:寄生構造函數模式

還記得講構造函數模式的時候,new的實質嗎?溫習一下: new的實質是執行了以下操作 1.創建一個全新的對象 2.這個對象會被執行[[prototype]]連接原型 3.函數調用中的this會綁定到新對象 4.如果函數沒有返回其他對象,那么new 構造就會自動返回這個默認對象 注意:如果返回了其他對象,那么new關鍵詞也就不會執行默認操作。

現在有個疑問:以上以new創建實例的模式都沒有返回新對象,而是依靠new的默認操作創建的對象實例。但是,but,but,new默認返回的對象是object類型,如果我現在要返回array或者其他對象,new就不能再執行其默認操作了,所以就要用return語句重寫構造函數,返回期望的對象類型。

function SpecialArray(){ var values = new Array(); values.push.apply(values, arguments); values.toPipedString = function(){ return this.join("|"); }; return values; }var a = new SpecialArray(2,6,8,9,4);a.toPipedString();//2|6|8|9|4

上面是網上隨便找的一段關于創建數組對象的例子,我們還是改寫我們的例子

function Person(name,sex){ var o = new Object(); o.name = name; o.sex = sex; o.say = function(){ console.log(this.name + ' is '+ this.sex) }; return o;}//與工廠模式的區別就是調用的時候加上了new關鍵字,工廠模式直接調用函數var Tom = new Person('Tom','male');var Linda = new Person('Linda','female');

那么就有人問了,這寄生構造函數模式又產生什么結果呢?其實答案和工廠模式輸出結果一模一樣。那有了工廠模式了,寄生構造模式是不是多余的呢?借用高程書上的原話: 書上原話:除了使用new操作符并把使用的包裝函數叫做構造函數之外,這個模式跟工廠模式其實是一模一樣的。構造函數在不返回值的情況下。默認會返回新對象實例。而通過在構造函數的末尾添加一個return語句,可以重寫調用構造函數時返回的值。

結束語

對象涉及封裝和繼承,繼承放在后一片文章去講。弄了這么一通,對象封裝也就6個模式,寄生構造函數模式跟工廠模式沒有什么大區別,而且我們經常用的是組合模式和動態原型模式。所以實踐看起來是要比學習單純許多。哈哈


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美国产第二页| 欧美一级片一区| 色无极影院亚洲| 国产精品欧美日韩| 国产精品国内视频| 亚洲国产精品电影| 国产精品com| 91国在线精品国内播放| 91亚洲国产精品| 久久久久久久久中文字幕| 日韩成人xxxx| 国产精品免费看久久久香蕉| 91老司机在线| 久久国产精品久久久久久久久久| 亚洲人高潮女人毛茸茸| 亚洲a∨日韩av高清在线观看| 久久精品视频在线| 欧美国产一区二区三区| 欧美精品18videos性欧美| 97香蕉久久超级碰碰高清版| 亚洲美女激情视频| 色爱av美腿丝袜综合粉嫩av| 色综合色综合网色综合| 亚洲成人黄色网址| 最近免费中文字幕视频2019| 最新91在线视频| 午夜精品久久久久久99热| 欧美三级欧美成人高清www| 国产精品视频男人的天堂| 国产97色在线| 亚洲人精选亚洲人成在线| 18一19gay欧美视频网站| yw.139尤物在线精品视频| 欧美与黑人午夜性猛交久久久| 国产精品2018| 日韩美女视频免费在线观看| 欧美国产极速在线| 亚洲成人网在线| 欧美视频中文字幕在线| 日韩大陆欧美高清视频区| 日韩美女激情视频| 国产精品第一区| 欧美另类精品xxxx孕妇| 色99之美女主播在线视频| 欧美黄色小视频| 日韩欧美国产黄色| 亚洲www在线| 国产欧美 在线欧美| 国产精品成人免费电影| 庆余年2免费日韩剧观看大牛| 青青精品视频播放| 亚洲人在线视频| 精品国产91乱高清在线观看| 成人久久一区二区三区| 国产精品美女www| 国产日韩一区在线| 久久免费成人精品视频| 国产成人精品视频在线观看| 久久黄色av网站| 国产精品青青在线观看爽香蕉| 中文字幕亚洲欧美在线| 一区二区亚洲欧洲国产日韩| 亚洲国产精品电影| 亚洲欧洲在线看| 久久精品91久久久久久再现| 日韩在线激情视频| 日韩欧美亚洲范冰冰与中字| 亚洲最大av网| 日韩中文字幕网址| 亚洲精品国产精品国自产在线| 久久亚洲成人精品| 17婷婷久久www| 欧美成人国产va精品日本一级| 亚洲精品国产精品乱码不99按摩| 亚洲国产精品人久久电影| 国精产品一区一区三区有限在线| 欧美福利视频网站| 日韩欧美极品在线观看| 国产精品爽爽爽| 97人人模人人爽人人喊中文字| 成人激情电影一区二区| 亚洲精品aⅴ中文字幕乱码| 狠狠爱在线视频一区| 深夜福利一区二区| 黄色一区二区三区| 精品国产91久久久久久老师| 91精品久久久久久久久中文字幕| 久久久精品2019中文字幕神马| 色老头一区二区三区| 亚洲另类欧美自拍| 亚洲欧洲av一区二区| 国产精品午夜一区二区欲梦| 亚洲最大的成人网| 成人写真福利网| 97视频在线观看成人| 日韩久久免费视频| 国产精品三级美女白浆呻吟| 91午夜理伦私人影院| 亚洲已满18点击进入在线看片| 久久综合88中文色鬼| 久久手机精品视频| 视频在线一区二区| 亚洲自拍欧美色图| 亚洲国产精品成人一区二区| 久久久www成人免费精品张筱雨| 国产日韩欧美日韩| 成人性生交大片免费看小说| 国产精品视频公开费视频| 亚洲成人av片| 91av在线播放| 欧美成人一区二区三区电影| 欧美日韩国产一中文字不卡| 成人福利视频网| 久久av红桃一区二区小说| 欧美一区深夜视频| 国产精品美女av| 亚洲精品二三区| 日韩精品视频中文在线观看| 亚洲免费精彩视频| 久久99精品视频一区97| 韩国视频理论视频久久| 日韩欧美一区二区三区久久| 国产日韩欧美视频在线| 欧美激情网友自拍| 国产精品久久久久久久久久东京| 136fldh精品导航福利| 欧美日韩一区二区在线| 97超级碰碰人国产在线观看| 欧美性猛交xxxx偷拍洗澡| 日韩最新免费不卡| 超碰精品一区二区三区乱码| 亚洲欧美一区二区三区久久| 另类专区欧美制服同性| 欧美黄色性视频| 国产亚洲欧美视频| 日韩精品在线免费| 国产成人综合精品在线| 在线观看视频亚洲| 亚洲欧洲高清在线| 精品日本美女福利在线观看| 亚州成人av在线| 日韩av不卡电影| 久久精品视频99| 九九精品在线视频| 在线精品国产欧美| 日韩av最新在线观看| 国产精品久久久久999| 日韩美女视频中文字幕| 色综合久久久888| 国产最新精品视频| 亚洲免费电影一区| 综合136福利视频在线| 久久理论片午夜琪琪电影网| 亚洲影视九九影院在线观看| 精品久久久久久亚洲国产300| 久久亚洲综合国产精品99麻豆精品福利| 日韩国产在线看| 久久免费视频网站| 亚洲第一区在线| 中文字幕av一区二区三区谷原希美| 国内精品久久久| 国产精品自拍视频| 久久69精品久久久久久久电影好| 在线电影av不卡网址|