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

您的位置:首頁技術(shù)文章
文章詳情頁

詳解 javascript對(duì)象創(chuàng)建模式

瀏覽:198日期:2023-10-09 16:08:09

創(chuàng)建模式

在javascript中,主要有以下幾種創(chuàng)建模式:

工廠模式構(gòu)造函數(shù)模式原型模式組合模式動(dòng)態(tài)原型模式寄生構(gòu)造函數(shù)模式穩(wěn)妥構(gòu)造模式

工廠模式

工廠模式是軟件工程領(lǐng)域一種廣為人知的設(shè)計(jì)模式。javascript實(shí)現(xiàn)方式:

function createPerson(name, obj, job) { var o = new Object(); o.name = name; o.obj = obj; o.job = job; o.sayName = function() { alert(this.name); } return o; } var person1 = createPerson('Nicholas', 29, 'software Enginner'); var person2 = createPerson('Greg', 27, 'Doctor');

工廠模式雖然解決了創(chuàng)建多個(gè)相似對(duì)象的問題,但卻沒有解決對(duì)象識(shí)別問題

構(gòu)造函數(shù)模式

function Person(name, age, job) { this.name = name; this.age = name; this.job = name; this.sayName = function () { alert(this.name); } } var person1 = new Person('Nicholas', 29, 'Software Engineer'); var person2 = new Person('Greg', 27, 'Doctor'); person1 instanceof Person; // true person1 instanceof Object; // true person2 instanceof Person; // true person2 instanceof Object; // true

new操作符實(shí)現(xiàn)原理請(qǐng)查看文章附錄

不同于工廠模式,構(gòu)造函數(shù)模式

沒有顯示創(chuàng)建對(duì)象

直接將屬性和方法賦值給了this對(duì)象

沒有return語句

解決了對(duì)象識(shí)別問題

但是構(gòu)造函數(shù)模式同樣存在問題,就是每個(gè)方法都要在每個(gè)實(shí)例上重新申明一遍。person1和person2都有一個(gè)名為 sayName() 的方法,但那兩個(gè)方法不是同一個(gè)Function實(shí)例。(在javascript中,函數(shù)實(shí)質(zhì)上也是對(duì)象,因此每定義一個(gè)函數(shù),也就是實(shí)例化一個(gè)對(duì)象。)

通過吧函數(shù)定義轉(zhuǎn)移到構(gòu)造函數(shù)外部可以解決這個(gè)問題:

function Person(name, age, job) { this.name = name; this.age = age; this.job = job; this.sayName = sayName; } function sayName() { alert(this.name); } var person1 = new Person('Nicholas', 29, 'Software Engineer'); var person2 = new Person('Greg', 27, 'Doctor');

但這種方式又帶來了一個(gè)新的問題,我們?cè)谌謩?chuàng)建了一個(gè)全局函數(shù)。

需要注意一點(diǎn),按照慣例,構(gòu)造函數(shù)始終應(yīng)該以一個(gè)大寫字母開頭,而非構(gòu)造函數(shù)應(yīng)該以一個(gè)小寫字母開頭。這主要用于區(qū)別構(gòu)造函數(shù)和非構(gòu)造函數(shù),因?yàn)闃?gòu)造函數(shù)本身也是函數(shù)。

原型模式

我們創(chuàng)建的每個(gè)函數(shù)都有一個(gè) prototype (原型)屬性,這個(gè)屬性是一個(gè)指針,指向一個(gè)對(duì)象,而這個(gè)對(duì)象的用途可以由特定類型的所有實(shí)例共享的屬性和方法。

函數(shù)原型對(duì)象請(qǐng)查看附錄

通過原型模式創(chuàng)建對(duì)象,我們不必在構(gòu)造函數(shù)中定義對(duì)象實(shí)例的信息,同時(shí)實(shí)例化多個(gè)對(duì)象,每個(gè)對(duì)象不會(huì)再申明一個(gè)新的函數(shù)。

可以看到, person1.sayName 和 person2.sayName 都指向了同一個(gè)函數(shù)。

但是原型模式的缺點(diǎn)也是顯而易見的。

首先原型模式省略了構(gòu)造函數(shù)模式傳遞參數(shù)這一環(huán)節(jié),結(jié)果導(dǎo)致所有實(shí)例的初始值在默認(rèn)情況下都是相同的屬性值。

更重要的是,因?yàn)閷傩院头椒ǘ挤胖迷谠蛯?duì)象上,實(shí)質(zhì)上原型上的屬性是 被所有實(shí)例所共享的 。對(duì)于包含基本值的屬性還表現(xiàn)正常,改變屬性值,只是在實(shí)例上添加一個(gè)同名屬性。但對(duì)于引用類型值的屬性來說,這可能是個(gè)災(zāi)難。

function Person() {} Person.prototype = { constructor: Person, name: 'Nicholas', age: 29, job: 'Software Engineer', friends: ['shelby', 'Court'], sayName: function() { alert(this.name); } }; var person1 = new Person(); var person2 = new Person(); person1.friends.push('Van'); person1.friends; // ['shelby', 'Court', 'Van'] person2.friends; // ['shelby', 'Court', 'Van']

組合模式

創(chuàng)建自定義類型最常見的方式,就是組合使用構(gòu)造函數(shù)模式和原型模式。構(gòu)造模式用于定義實(shí)例屬性,而原型模式用于定義方法和共享屬性。

這樣,每個(gè)實(shí)例都會(huì)有自己的一份實(shí)例屬性副本,但同時(shí)又共享方法的引用。

function Person(name, age, job) { this.name = name; this.age = age; this.job = job; this.friends = ['Shelby', 'Court']; } Person.prototype.sayName = function() { alert(this.name); } var person1 = new Person('Nicholas', 29, 'Software Enginner'); var person2 = new Person('Greg', 27, 'Doctor'); person1.friends.push('Van'); person1.firends; // ['Shelby', 'Court', 'Van']; person2.firends; // ['Shelby', 'Court'] person1.firends === person2.firends; // false person1.sayName === person2.sayName; // true

動(dòng)態(tài)原型模式

function Person(name, age, job) { this.name = name; this.age = age; this.job = job;if (typeof this.sayName != 'function') { Person.prototype.sayName = function() {alert(this.name); } } }

寄生構(gòu)造函數(shù)模式

寄生模式的基本概念就是創(chuàng)建一個(gè)函數(shù),該函數(shù)的作用僅僅是封裝創(chuàng)建對(duì)象的代碼,然后再返回新創(chuàng)建的對(duì)象。

function Person(name, age, job) { var o = new Object(); o.name = name; o.age = age; o.job = job.o.sayName = function() { alert(this.name); } } var person1 = new Person('Nicholas', 29, 'Software Engineer'); person1.sayName(); // 'Nicholas'

看起來,除了使用new操作符之外,這個(gè)模式和工廠模式其實(shí)是一模一樣的。這個(gè)模式可以在特殊的情況下用來作為對(duì)象創(chuàng)建構(gòu)造函數(shù)。假設(shè)我們需要一個(gè)具有額外方法的特殊數(shù)組類型。由于不能直接修改Array構(gòu)造函數(shù),因此可以使用這個(gè)模式。

function SpecialArray() { var values = [];values.push.push(values, arguments); values.toPipedString = function() { return this.join('|'); }return values; } var colors = new SpecialArray('red', 'blue', 'green'); colors.toPipedString(); // 'red|blue|green'

該模式主要缺點(diǎn):返回的對(duì)象和構(gòu)造函數(shù)或構(gòu)造函數(shù)的原型屬性間沒有關(guān)系,不·能依賴instanceof來確定對(duì)象類型。在其他模式能夠使用的情況下,盡量不要使用這種模式。

穩(wěn)妥構(gòu)造函數(shù)模式

function Person(name, age, job) { var o = new Object(); var name = name; var age = age; var job = jbo;o.sayName = function() { alert(name); } } var person1 = Person('Nicholas', 29, 'Software Enginner'); firend.sayName(); // 'Nicholas' 附錄 new 操作符

new操作符實(shí)際上會(huì)經(jīng)歷4個(gè)步驟:

創(chuàng)建一個(gè)空的簡(jiǎn)單JavaScript對(duì)象(即**{}**); 鏈接該對(duì)象(設(shè)置該對(duì)象的constructor)到另一個(gè)對(duì)象 ; 將步驟1新創(chuàng)建的對(duì)象作為**this**的上下文 ; 如果該函數(shù)沒有返回對(duì)象,則返回**this**。

function new(func) { var o = {}; o.__proto__ = func.prototype; var result = func.apply(o, arguments); return typeof result === 'object' ? object : o; }

函數(shù)原型對(duì)象

理解原型對(duì)象

無論什么時(shí)候,只要?jiǎng)?chuàng)建一個(gè)新函數(shù),就會(huì)根據(jù)一組特定的規(guī)則為該函數(shù)創(chuàng)建一個(gè)prototype屬性,這個(gè)屬性指向函數(shù)的原型對(duì)象。在默認(rèn)情況下,所有原型對(duì)象都會(huì)自動(dòng)獲得一個(gè)construtor(構(gòu)造函數(shù))屬性,這個(gè)屬性包含一個(gè)指向prototype屬性所在函數(shù)的指針。

在創(chuàng)建了一個(gè)自定義的構(gòu)造函數(shù)之后,其原型對(duì)象只會(huì)取得construtoe屬性,至于其他屬性,則都是從Object繼承而來。當(dāng)調(diào)用構(gòu)造函數(shù)創(chuàng)建一個(gè)新實(shí)例時(shí),該實(shí)例的內(nèi)部將包含一個(gè)指針(內(nèi)部屬性),指向構(gòu)造函數(shù)的原型對(duì)象,這個(gè)指針叫[[Prototype]]。在多數(shù)瀏覽器中,每個(gè)對(duì)象都支持一個(gè)屬性__proto__來調(diào)用[[Prototype]]。

詳解 javascript對(duì)象創(chuàng)建模式

雖然所有實(shí)現(xiàn)都無法直接訪問[[Prototype]],但可以通過isPrototype方法來確定對(duì)象之間是否存在關(guān)系。

我們測(cè)試了person1和person2,都返回了true。因?yàn)樗麄儍?nèi)部都有一個(gè)指向Person.prototype的指針。

Object.getPrototype()可以返回對(duì)象的原型對(duì)象。

每當(dāng)代碼讀取某個(gè)對(duì)象的屬性時(shí),都會(huì)執(zhí)行一次搜索,目標(biāo)是具有給定名字的屬性。搜索首先會(huì)從對(duì)象本身開始,如果在實(shí)例中找到了對(duì)應(yīng)的屬性,則返回該屬性的值。如果沒找到,則繼續(xù)搜索指針指向的原型對(duì)象。這也是為什么我們?cè)趐erson1和person2兩個(gè)實(shí)例中,并沒有定義sayName這個(gè)屬性,但仍能夠正常使用。我們?cè)谡{(diào)用person1.sayName()是,會(huì)執(zhí)行兩次搜索。首先,解析器會(huì)問:“實(shí)例person1有sayName屬性嗎?”,答:“沒有”。然后他繼續(xù)搜索,再問:“person1的原型有sayName屬性嗎?”,答:“有”。于是,它就讀取保存在原型中的函數(shù)。

雖然我們能夠通過實(shí)例訪問原型的屬性,但卻不能重新原型的屬性。如果我們?cè)趯?shí)例上添加屬性名,而這個(gè)屬性名又與原型中的屬性名相同,即我們希望在實(shí)例中重寫屬性。

function Person() {} Person.prototype.name = ’Nicholas’; var person1 = new Person(); var person2 = new Person(); person1.name === person2.name; // true person1.name = ’Greg’; person1.name === person2.name; // false person1.name; // ’Greg’ person2.name; // ’Nicholas’ person1.__proto__.name; // ’Nicholas’

事實(shí)上,當(dāng)我們重寫原型屬性時(shí),只是在實(shí)例上添加了一個(gè)新屬性。當(dāng)我們把實(shí)例上的屬性刪除后,又會(huì)暴露出原型屬性。

delete person1.name; person1.name; // ’Nicholas’

使用hasOwnProperty()函數(shù)能判斷屬性是否在實(shí)例上。

person1.hasOwnProperty(’name’); // false person1.name = ’Greg’; person1.hasOwnProperty(’name’); // true

以上就是詳解 javascript對(duì)象創(chuàng)建模式的詳細(xì)內(nèi)容,更多關(guān)于Java 創(chuàng)建模式的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: JavaScript
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩中文字幕亚洲一区二区va在线| 深夜视频一区二区| 极品日韩av| 久久国产毛片| 999国产精品视频| 久久网站免费观看| 好吊一区二区三区| 久热精品在线| 99热精品在线| 亚洲五月综合| 欧美色综合网| 精品高清久久| 99久精品视频在线观看视频| 蜜桃视频欧美| 亚洲精品乱码| 欧美激情视频一区二区三区免费 | 亚洲一区网站| 久久亚洲二区| 欧美久久久网站| 国产一区二区三区探花| www.com.cn成人| 蜜桃成人av| 视频一区日韩精品| 国产精品分类| 播放一区二区| 一本色道久久精品| 日本不卡一区二区| 国产成人精品福利| 尤物tv在线精品| 亚洲一卡久久| 久久久精品日韩| 国产激情久久| 视频在线在亚洲| 成人av二区| 中文字幕一区二区av| 亚洲精品婷婷| 国产精品a久久久久| 一区二区三区网站| 亚洲永久av| 亚洲香蕉网站| 高清av一区二区三区| 激情欧美一区二区三区| 丝袜国产日韩另类美女| 91久久久久| 日本不卡一二三区黄网| 精品91福利视频| 尤物精品在线| 国产精品igao视频网网址不卡日韩| 久久精品亚洲人成影院 | 精品日韩视频| 亚洲+小说+欧美+激情+另类| 麻豆国产91在线播放| 欧美日韩高清| 欧美久久精品| 欧美日韩国产一区精品一区| 日韩欧美2区| 亚洲午夜精品久久久久久app| 青青草精品视频| 日韩中文影院| 日韩福利视频一区| 青青久久av| 久久国产免费看| 99久久久久国产精品| 国产欧美一区二区三区米奇| 亚洲高清不卡| 精品一区电影| 在线观看亚洲精品福利片| 国产中文字幕一区二区三区| 视频一区二区中文字幕| 国产夫妻在线| 视频一区中文字幕国产| 超碰成人av| 日本成人在线一区| 欧美日韩国产一区二区三区不卡| 91成人在线精品视频| 久久蜜桃精品| 麻豆成人91精品二区三区| 亚洲精品字幕| 女人av一区| 欧美国产美女| 国产欧美一区二区三区米奇| 巨乳诱惑日韩免费av| 日韩成人综合| 欧美aa在线视频| 日本va欧美va瓶| 久久美女精品| 麻豆成全视频免费观看在线看| 婷婷综合一区| 国产亚洲永久域名| 中文字幕系列一区| 高清精品久久| 欧美经典一区| 国产精品一区二区av日韩在线| 免费国产亚洲视频| 激情欧美一区二区三区| 日韩久久精品网| 久久精品女人| 国产精品分类| 国产精品www.| 欧美亚洲免费| 亚洲在线观看| 欧美精品激情| 亚洲国产成人精品女人| 日韩av一级| 日韩理论片av| 欧美aa在线观看| 免费观看亚洲| 亚洲三级欧美| 手机在线电影一区| 福利一区和二区| 国产精品不卡| 久草免费在线视频| 中文字幕一区久| 在线天堂资源www在线污| 精品一区二区三区在线观看视频| 日韩二区在线观看| 人人爱人人干婷婷丁香亚洲| 欧美日韩一区二区三区在线电影| 日韩福利视频网| 91成人精品在线| 欧美片第1页综合| 国产调教一区二区三区| 欧美日韩免费观看一区=区三区| 99tv成人| 亚洲欧洲一区| 丝瓜av网站精品一区二区| 久久午夜精品| 亚洲精品在线二区| 日本中文字幕视频一区| 欧美日韩va| 三级欧美在线一区| 亚洲综合日本| 亚洲精选久久| 国产欧美亚洲一区| 国产成人精选| 日本韩国欧美超级黄在线观看| 亚洲一级二级| 老司机精品久久| 日本h片久久| 国产精品3区| 国产一区二区三区网| 快播电影网址老女人久久| 亚洲国内欧美| re久久精品视频| 免费成人在线影院| 综合激情网站| 国产精久久一区二区| 日韩伦理在线一区| 九九久久电影| 日韩和欧美一区二区| 国产麻豆精品| 91嫩草亚洲精品| 激情婷婷亚洲| 亚洲影视一区二区三区| 青青伊人久久| 国产不卡精品在线| 国产综合亚洲精品一区二| 在线视频亚洲| 国产私拍福利精品视频二区| 精品久久视频| 91精品国产乱码久久久久久久| 在线 亚洲欧美在线综合一区| 日本综合精品一区| 国产一区二区三区四区大秀| 蜜臀久久99精品久久一区二区| 日韩专区欧美专区| 捆绑调教美女网站视频一区| 亚洲v在线看| 日韩超碰人人爽人人做人人添| 国产一区二区三区久久久久久久久| 久久高清精品| 日韩福利视频导航| 日韩av首页| 日韩中文字幕视频网| 国产一区二区三区探花| 1024精品久久久久久久久| 日韩欧美三区| 免费看av不卡| 亚洲精品乱码日韩| 都市激情国产精品| 亚洲精品系列| 毛片在线网站| 亚洲人成网站在线在线观看| 精品资源在线| 久久aⅴ国产紧身牛仔裤| 国产精品久久亚洲不卡| 国产二区精品| 毛片不卡一区二区| 香蕉成人久久| 超碰在线99| 午夜亚洲福利| 亚洲婷婷在线| 国产精品视频一区二区三区四蜜臂 | 久久精品72免费观看| 日韩国产欧美| 欧美一级二级视频| 欧美日韩四区| 国产一区二区三区网| 天使萌一区二区三区免费观看| 精品三级在线观看视频|