摘要:當(dāng)構(gòu)造函數(shù)沒有顯式地返回一個(gè)值的時(shí)候,對(duì)其執(zhí)行操作之后,會(huì)返回這個(gè)構(gòu)造函數(shù)實(shí)例化之后的對(duì)象。
JavaScript里實(shí)例化一個(gè)對(duì)象的時(shí)候,我們常用的方法就是使用new操作符。
var Foo = function(x, y) { this.x = x this.y = y } var foo = new Foo(1, 2) // Foo?{x: 1, y: 2}
那么new操作符到底做了哪些工作?我們可以看一下foo這個(gè)對(duì)象到底是一個(gè)怎樣的對(duì)象。
首先,foo本身是一個(gè)對(duì)象,然后,他本身有兩個(gè)屬性,x跟y。同時(shí),在大多數(shù)瀏覽器的控制臺(tái)上,我們還能看到一個(gè)顏色稍淺的屬性,叫__proto__,他有兩個(gè)屬性,constructor跟__proto__。
__proto__是一個(gè)訪問器屬性。他指向的是當(dāng)前對(duì)象本身的[[Prototype]],這個(gè)[[Prototype]]并不是一個(gè)屬性,他只是一個(gè)符號(hào),代表的是構(gòu)造函數(shù)Foo的原型對(duì)象Foo.prototype的,具體可以參考一下MDN上的描述。
foo.__proto__ === Foo.prototype // true
所以,我們大致描述一下
var Foo = function(x, y) { this.x = x this.y = y } // 1. 創(chuàng)建一個(gè)空對(duì)象 var foo = {} // 2. 調(diào)用構(gòu)造函數(shù),并且將構(gòu)造函數(shù)的`this`指向foo Foo.call(foo, 1, 2) // 3. foo繼承Foo的原型對(duì)象 foo.__proto__ = Foo.prototype
等等,雖然我們上面這么寫最后foo的確跟new Foo()出來的對(duì)象是一樣的,但是情況并不僅僅這么簡(jiǎn)單。
我們知道,new操作符操作的是一個(gè)函數(shù),在上面的栗子里,函數(shù)Foo并沒有顯式地返回任何值,所以執(zhí)行這個(gè)函數(shù)之后,返回值是undefined。當(dāng)構(gòu)造函數(shù)沒有顯式地返回一個(gè)值的時(shí)候,對(duì)其執(zhí)行new操作之后,會(huì)返回這個(gè)構(gòu)造函數(shù)實(shí)例化之后的對(duì)象。
那如果我返回了某個(gè)值呢?
var Foo = function(x, y) { this.x = x this.y = y return { a: this.x } } var foo = new Foo(1, 2) // {a: 1}
foo就是執(zhí)行這個(gè)函數(shù)之后的返回值,那么這個(gè)時(shí)候new Foo()跟Foo()就沒有任何區(qū)別了,所以通常情況下,我們并不會(huì)選擇在一個(gè)構(gòu)造函數(shù)里返回某個(gè)值。
特別要注意的是,如果你在構(gòu)造函數(shù)里返回的不是一個(gè)對(duì)象,而是一個(gè)普通的值,比如說一個(gè)Number類型或者String類型的值,那么new之后返回的還是實(shí)例化之后的對(duì)象。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/107297.html
摘要:既然構(gòu)造函數(shù)有屬于自己的原型對(duì)象,那么我們應(yīng)該能讓另一個(gè)構(gòu)造函數(shù)來繼承他的原型對(duì)象咯我們?cè)跇?gòu)造函數(shù)內(nèi)部執(zhí)行了函數(shù)并改變了函數(shù)內(nèi)部的指向其實(shí)這個(gè)指向的是實(shí)例化之后的對(duì)象。 我們?cè)谟懀╩ian)論(shi)JavaScript這門語言時(shí),總是繞不過的一個(gè)話題就是繼承與原型鏈。那么繼承與原型鏈到底是什么呢? 我很喜歡的一個(gè)聊天模式是:我不能說XX是什么,我只能說XX像什么。也就是說我不直接跟...
摘要:把方法移動(dòng)到構(gòu)造函數(shù)外部把方法移至外面,這樣每次實(shí)例化內(nèi)部的只是全局的引用,這樣避免了重復(fù)。構(gòu)造函數(shù)什么體內(nèi)什么都沒有,如果有叫做實(shí)例方法,實(shí)力屬性缺點(diǎn)重復(fù)敲,造成大量的重復(fù)輸入。 從對(duì)象聲明開始一步步介紹 1.普通對(duì)象聲明 首先創(chuàng)建自定義對(duì)象的最簡(jiǎn)單方式就是創(chuàng)建一個(gè)Object的實(shí)例,然后在為他們添加屬性和方法,如下所示: var person = new Object(); ...
摘要:北山愚公者年且九十面山而居。工廠模式愚小公北山愚小小公北山工廠模式比較明顯的一個(gè)缺點(diǎn)就是由于生成并返回了一個(gè)中間對(duì)象,所以不能判斷對(duì)象的類型。 ??太行、王屋二山,方七百里,高萬仞。本在冀州之南,河陽之北....... ??嗯,按照慣例,第一句話就是騙你們點(diǎn)進(jìn)來的。在讀本文之前,希望你對(duì)Javascript的原型和原型鏈有一定了解,這有助于你更好的理解本文,之前有寫過一篇相關(guān)文章,點(diǎn)此...
摘要:在和中都保留了數(shù)組的強(qiáng)引用,所以在中簡(jiǎn)單的清除變量?jī)?nèi)存并沒有得到釋放,因?yàn)檫€存在引用計(jì)數(shù)。而在中,它的鍵是弱引用,不計(jì)入引用計(jì)數(shù)中,所以當(dāng)被清除之后,數(shù)組會(huì)因?yàn)橐糜?jì)數(shù)為而被回收掉。其實(shí)我們主要注意的引用是不計(jì)引用計(jì)數(shù)的,就好理解了。 showImg(https://segmentfault.com/img/remote/1460000019147368?w=900&h=383); 前...
摘要:原文如果按面向?qū)ο蟮乃悸啡ブv的,還是很難去理解,我們可以從另一個(gè)方向去理解一下它。 原文:https://legacy.ofcrab.com/press/javascript-new.html 如果按面向?qū)ο蟮乃悸啡ブv JavaScript 的 new,還是很難去理解,我們可以從另一個(gè)方向去理解一下它。 你這些人類 我是一名程序員,也是一個(gè)人,我可能: 有一個(gè)響亮亮的名稱 在某一天出...
閱讀 2617·2023-04-25 22:09
閱讀 2848·2021-10-14 09:47
閱讀 1956·2021-10-11 11:10
閱讀 2696·2021-10-09 09:44
閱讀 3393·2021-09-22 14:57
閱讀 2507·2019-08-30 15:56
閱讀 1627·2019-08-30 15:55
閱讀 787·2019-08-30 14:13