摘要:但要講原型就必須講構(gòu)造函數(shù),講構(gòu)造函數(shù)就必須講對象。所以我們是無法容忍這么愚蠢的事情發(fā)生的,因此就有了構(gòu)造函數(shù),跟類有點相似,但我們這里不討論類。
首先,上一篇文章詳細分析了原型屬性和自身屬性的區(qū)別,但為了讓大家更明白一點,所以這里講一下為什么需要原型。但要講原型就必須講構(gòu)造函數(shù),講構(gòu)造函數(shù)就必須講對象。首先來看看對象。
新建一個對象的方法: 1.new Object:
var newObj = new Object; newObj.name = "keti"; newObj.color = "red"; newObj.changeColor = function(color){ newObj.color = color; }
這種方法看上去很蠢,所以我們找到另一種方法:使用literal直接創(chuàng)建,看上去要優(yōu)雅得多:
2.literal
var newObj = { name: "keti"; color: "red"; changeColor: function(color){ newObj.color = color; } }
使用literal來常見對象似乎很不錯,比較直觀,兩個卷括號括起來就是個對象嘛,多清晰明了。但是如果你要創(chuàng)建一系列結(jié)構(gòu)類似的對象,難道要這樣一個個寫嗎?作為程序員我們的遵循的理念就是盡可能減少重復(fù),也就是著名的DRY(Don"t Repeat Youself)。所以我們是無法容忍這么愚蠢的事情發(fā)生的,因此就有了構(gòu)造函數(shù),跟類有點相似,但我們這里不討論類。構(gòu)造函數(shù)就是建立一個模板,不綁定數(shù)據(jù),只提供架構(gòu),你只需把相關(guān)數(shù)據(jù)填充到模板里就可以生成一個新的對象了:
3.構(gòu)造函數(shù)function NewObj(name,color){ this.name = name; this.color = color; this.changeColor = function(c){ this.color = c; } } var newObj1 = new NewObj("keti","red");
上面代碼中,new是一個構(gòu)造器,NewObj是我們創(chuàng)建好的模板,填入數(shù)據(jù),賦給變量newObj1,ok,新的對象就這樣生成了。
到此創(chuàng)建對象的方法似乎已經(jīng)很不錯了,但仔細觀察我們還發(fā)現(xiàn)了新的問題:對于changeColor()這個方法事實上對所有instance來說是相同的,也就是說可以共享,不像name和color那樣需要綁定給每個instance。而構(gòu)造函數(shù)這種形式每次都會把自身的屬性全部copy一份給每個instance,這就造成了不必要的浪費;并且,當(dāng)我們想修改這個方法時,就必須重新生成所有的instance才能獲得更新,比如說:
function NewObj(name,num){ this.name = name; this.num = num; this.changNum = function(c){ this.num = c; } } var newObj1 = new NewObj("kemi",10); newObj1.changNum(100); newObj1.num; //很明顯是100
我現(xiàn)在想修改changNum()這個函數(shù):
function NewObj(name,num){ this.name = name; this.num = num; this.changNum = function(c){ this.num = c*2; } } newObj1.changNum(100); newObj1.num; //依然是100,也就是說這個對象并不受我們修改的模板影響到
怎么解決這個問題呢?有一個原型對象。原型對象里的屬性和方法并不是像構(gòu)造函數(shù)自身屬性一樣copy給每個instance,而是“引用”,也可以理解為給每個instance提供一個指向該原型對象的指針,這樣每個instance就能找到原型對象里的屬性,而很明顯,這是一種共享,也就是說,當(dāng)你修改了這個原型里的屬性,那么所有共享該屬性的instance都能獲得這個修改。因此,原型恰好解決了上面提到的兩個問題。
function NewObj(name,num){ this.name = name; this.num = num; } NewObj.prototype.changNum = function(c){ this.num = c; } var newObj1 = new NewObj("kemi",10); newObj1.changNum(100); newObj1.num; //很明顯是100 NewObj.prototype.changNum = function(c){ this.num = c*2; }//我們重新修改一下這個方法 newObj1.changNum(100); newObj1.num; //變成200了。
為什么一般情況下會把屬性直接寫在構(gòu)造函數(shù)內(nèi),而方法通過prototype添加呢?這兩種方式的區(qū)別上面其實已經(jīng)有所展現(xiàn)了:大部分的instance的屬性都是不同的,比如說name,因此在構(gòu)造函數(shù)內(nèi)通過this直接綁定給instance無疑是個好方案,而方法通常是通用的,使用prototype可以讓每個instance共享同一個方法,而不用每個都copy一次,又能實現(xiàn)實時更新。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/87609.html
摘要:面向?qū)ο笾杏腥筇卣?,封裝,繼承,多態(tài)。這不僅無法做到數(shù)據(jù)共享,也是極大的資源浪費,那么引入對象實例對象的屬性指向其構(gòu)造函數(shù),這樣看起來實例對象好像繼承了對象一樣。實例對象的原型指向其構(gòu)造函數(shù)的對象構(gòu)造器的指向。 前言 為什么說是再談呢,網(wǎng)上講解這個的博客的很多,我開始學(xué)習(xí)也是看過,敲過就沒了,自以為理解了就結(jié)束了,書到用時方恨少啊。實際開發(fā)中一用就打磕巴,于是在重新學(xué)習(xí)了之后分享出來...
摘要:問題修改實例的,即修改了構(gòu)造函數(shù)的原型對象的共享屬性到此處,涉及到的內(nèi)容大家可以再回頭捋一遍,理解了就會覺得醍醐灌頂。 開場白 大三下學(xué)期結(jié)束時候,一個人跑到帝都來參加各廠的面試,免不了的面試過程中經(jīng)常被問到的問題就是JS中如何實現(xiàn)繼承,當(dāng)時的自己也是背熟了實現(xiàn)繼承的各種方法,回過頭來想想?yún)s不知道__proto__是什么,prototype是什么,以及各種繼承方法的優(yōu)點和缺點,想必有好...
摘要:返回的函數(shù)可以作為構(gòu)造函數(shù)使用被用作構(gòu)造函數(shù)時,應(yīng)指向出來的實例,同時有屬性,其指向?qū)嵗脑?。判斷?dāng)前被調(diào)用時,是用于普通的還是用于構(gòu)造函數(shù)從而更改指向。運算符用來測試一個對象在其原型鏈中是否存在一個構(gòu)造函數(shù)的屬性。 寫在最前 最近開始重新學(xué)習(xí)一波js,框架用久了有些時候覺得這樣子應(yīng)該可以實現(xiàn)發(fā)現(xiàn)就真的實現(xiàn)了,但是為什么這么寫好像又說不太清楚,之前讀了LucasHC以及冴羽的兩篇關(guān)于...
摘要:先來說其實構(gòu)造函數(shù)也有,原型對象有,實例有也有,或者更加籠統(tǒng)的說,所有對象都是有的。構(gòu)造函數(shù)的原型對象上的會指向構(gòu)造函數(shù)。由于屬性是可以變更的,所以未必真的指向?qū)ο蟮臉?gòu)造函數(shù),只是一個提示。 續(xù)上一集內(nèi)容,通過構(gòu)造函數(shù)的方式,成功地更新了生產(chǎn)技術(shù),老板笑呵呵,工人少奔波,只是問題總比辦法多,又遇到一個新問題,就是會造成一些資源的重復(fù)和浪費,那么經(jīng)過工程師們的智慧交流,他們產(chǎn)生了一個新技...
摘要:在中,萬物皆對象。在日常中,我們除了經(jīng)常聽到原型這個詞之外,還經(jīng)常會聽到原型鏈這個詞,那么這兩個詞到底有什么關(guān)系呢,下面我們就來探究一下。指向的對象往往被稱為函數(shù)的原型。很簡單,委托實際上就是原型鏈。 在JavaScript中,萬物皆對象。每個對象都有一個特殊的內(nèi)部屬性,[[Prototype]](原型)。它是對于其他對象的引用,也就是說它關(guān)聯(lián)到別的對象(如果它不為空)。 在日常中,我...
摘要:構(gòu)造函數(shù)就是一個具有屬性的方法,該屬性被稱作標(biāo)識具有一個屬性,但是沒有用戶定義它。然而,構(gòu)造函數(shù)的屬性可以被改變,并且將影響用這個原型創(chuàng)建的對象。 原文地址:http://dailyjs.com/2012/05/20/js101-prototype/ 在花費了很多年研究面向?qū)ο缶幊讨?,想在javascript使用是令人失望的。主要是從根源上缺少一個class這樣的關(guān)鍵詞。然而,jav...
閱讀 3948·2021-11-18 13:19
閱讀 1182·2021-10-11 10:58
閱讀 3292·2019-08-29 16:39
閱讀 3146·2019-08-26 12:08
閱讀 2038·2019-08-26 11:33
閱讀 2461·2019-08-23 18:30
閱讀 1309·2019-08-23 18:21
閱讀 2522·2019-08-23 18:18