摘要:構(gòu)造函數(shù)模式如果要創(chuàng)建許多對象,傳統(tǒng)方法存在以下問題對象名太多,容易搞重復新建一個對象就要全部重寫屬性和方法,過于復雜無法發(fā)揮的面向?qū)ο髢?yōu)勢繼承由于本身沒有類的概念,因此誕生了構(gòu)造函數(shù)模式來創(chuàng)建對象,該方法利用函數(shù)創(chuàng)建對象。
對象,一種數(shù)據(jù)類型。對象是屬性(變量)和方法(函數(shù))結(jié)合在一起的數(shù)據(jù)實體
對象的出現(xiàn),就是為了解決封裝的問題。可以將許多屬性與方法封裝在一個對象里,方便調(diào)用,也符合人的思考方式。
JavaScript中創(chuàng)建對象的基本方法創(chuàng)建Object實例,再添加屬性和方法
var person = new Object(); person.name = "Jonathan"; person.age = 23; person.job = "Developer"; person.sayName = function () { console.log(this.name); };
對象字面量方法
由于上述寫法繁瑣,故出現(xiàn)了對象字面量方法創(chuàng)建對象。
var person = { name: "Jonathan", age: 23, job: "Developer", sayName: function () { console.log(this.name); } }; console.log(person.name); //Jonathan person.sayName(); //Jonathan
這樣一來,就把屬性和方法封裝進了一個對象中,方便調(diào)用。
構(gòu)造函數(shù)模式如果要創(chuàng)建許多對象,傳統(tǒng)方法存在以下問題
對象名太多,容易搞重復
新建一個對象就要全部重寫屬性和方法,過于復雜
無法發(fā)揮JavaScript的面向?qū)ο髢?yōu)勢(繼承)
由于JavaScript本身沒有類的概念,因此誕生了構(gòu)造函數(shù)模式來創(chuàng)建對象,該方法利用函數(shù)創(chuàng)建對象。由于函數(shù)本身也是對象,因此可以這么操作。
構(gòu)造函數(shù)創(chuàng)建對象的方法是:
function Person(name, age, job){ this.name = name; this.age = age; this.job = job; this.sayName = function(){ console.log(this.name); }; } var person1 = new Person("Nicholas", 29, "Software Engineer"); var person2 = new Person("Greg", 27, "Doctor");
要點:
構(gòu)造函數(shù)命名應以大寫字母開頭(約定俗成的規(guī)矩)
構(gòu)造函數(shù)本身也是函數(shù),只不過是用來創(chuàng)建對象的
要創(chuàng)建對象的實例,必須要用new操作符,否則跟調(diào)用函數(shù)無異。
任何函數(shù),只要通過new操作符來調(diào)用,它就可以作為構(gòu)造函數(shù)。
至此,一個Person對象的創(chuàng)建就完成了,它有以下優(yōu)點:
新建對象只用給函數(shù)提供參數(shù),簡化了創(chuàng)建。
有了實例的概念,如Person1就是Person的實例。無形之中給對象歸了類。
更好的體現(xiàn)了封裝,創(chuàng)建對象只用給參數(shù),不用關(guān)心對象內(nèi)部細節(jié)。
但用構(gòu)造函數(shù)模式的方法創(chuàng)建對象并不是完美的,它存在以下問題,即:
每個方法(對象內(nèi)置函數(shù))都要在實例上重新創(chuàng)建一遍
構(gòu)造函數(shù)也可以用以下方法定義,方便我們發(fā)現(xiàn)問題
function Person(name, age, job){ this.name = name; this.age = age; this.job = job; this.sayName = new Function(console.log(this.name)); }; } var person1 = new Person("Nicholas", 29, "Software Engineer"); var person2 = new Person("Greg", 27, "Doctor"); console.log(person1.sayName == person2sayName); //false
在新建對象person1和person2時,分別新建了兩個不同的方法person1.sayName()和person2.sayName()。
但這很沒有必要,只需要公用一個sayName()方法就好了。為了解決上述問題,誕生了原型模式
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/91946.html
摘要:深入之繼承的多種方式和優(yōu)缺點深入系列第十五篇,講解各種繼承方式和優(yōu)缺點。對于解釋型語言例如來說,通過詞法分析語法分析語法樹,就可以開始解釋執(zhí)行了。 JavaScript深入之繼承的多種方式和優(yōu)缺點 JavaScript深入系列第十五篇,講解JavaScript各種繼承方式和優(yōu)缺點。 寫在前面 本文講解JavaScript各種繼承方式和優(yōu)缺點。 但是注意: 這篇文章更像是筆記,哎,再讓我...
摘要:理解的函數(shù)基礎要搞好深入淺出原型使用原型模型,雖然這經(jīng)常被當作缺點提及,但是只要善于運用,其實基于原型的繼承模型比傳統(tǒng)的類繼承還要強大。中文指南基本操作指南二繼續(xù)熟悉的幾對方法,包括,,。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。 怎樣使用 this 因為本人屬于偽前端,因此文中只看懂了 8 成左右,希望能夠給大家?guī)韼椭?...(據(jù)說是阿里的前端妹子寫的) this 的值到底...
摘要:編寫高質(zhì)量的要點深入理解系列一知識點最小全局變量全局變量命名易與第三方的腳本引起沖突所以盡可能少的使用全局變量是很重要的相關(guān)策略有命名空間模式或是函數(shù)立即自動執(zhí)行,但是要想讓全局變量少最重要的還是始終使用來聲明變量。 Title: 編寫高質(zhì)量Javascript的要點-Review深入理解Javascript系列(一)date: 2017-6-9 14:14:20 status: p...
摘要:的翻譯文檔由的維護很多人說,阮老師已經(jīng)有一本關(guān)于的書了入門,覺得看看這本書就足夠了。前端的異步解決方案之和異步編程模式在前端開發(fā)過程中,顯得越來越重要。為了讓編程更美好,我們就需要引入來降低異步編程的復雜性。 JavaScript Promise 迷你書(中文版) 超詳細介紹promise的gitbook,看完再不會promise...... 本書的目的是以目前還在制定中的ECMASc...
摘要:前言本章我們要講解的是五大原則語言實現(xiàn)的第篇,接口隔離原則。接口隔離原則和單一職責有點類似,都是用于聚集功能職責的,實際上可以被理解才具有單一職責的程序轉(zhuǎn)化到一個具有公共接口的對象。與我們下面討論的一些小節(jié)是里關(guān)于違反接口隔離原則的影響。 前言 本章我們要講解的是S.O.L.I.D五大原則JavaScript語言實現(xiàn)的第4篇,接口隔離原則ISP(The Interface Segreg...
摘要:更多資料如果你想了解更多關(guān)于的資料,下面的連接對你絕對有用關(guān)于本文本文轉(zhuǎn)自大叔的深入理解系列。深入理解系列文章,包括了原創(chuàng),翻譯,轉(zhuǎn)載,整理等各類型文章,原文是大叔的一個非常不錯的專題,現(xiàn)將其重新整理發(fā)布。 前言 寫這篇文章的目的是經(jīng)??吹介_發(fā)人員說:把字符串轉(zhuǎn)化為JSON對象,把JSON對象轉(zhuǎn)化成字符串等類似的話題,所以把之前收藏的一篇老外的文章整理翻譯了一下,供大家討論,如有錯誤,...
閱讀 2993·2021-10-14 09:42
閱讀 3250·2019-08-30 15:52
閱讀 3409·2019-08-30 14:02
閱讀 1160·2019-08-29 15:42
閱讀 608·2019-08-29 13:20
閱讀 1220·2019-08-29 12:24
閱讀 548·2019-08-26 10:20
閱讀 731·2019-08-23 18:31