成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

當(dāng)我們?cè)贘avaScript中new一個(gè)對(duì)象的時(shí)候,我們到底在做什么

woshicixide / 1932人閱讀

摘要:當(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è)屬性,xy。同時(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

相關(guān)文章

  • 繼承與原型

    摘要:既然構(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像什么。也就是說我不直接跟...

    My_Oh_My 評(píng)論0 收藏0
  • 使用 new 操作符內(nèi)部到底什么

    摘要:把方法移動(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(); ...

    curlyCheng 評(píng)論0 收藏0
  • 用愚公移山說明Javascript創(chuàng)建對(duì)象各種姿勢(shì)

    摘要:北山愚公者年且九十面山而居。工廠模式愚小公北山愚小小公北山工廠模式比較明顯的一個(gè)缺點(diǎn)就是由于生成并返回了一個(gè)中間對(duì)象,所以不能判斷對(duì)象的類型。 ??太行、王屋二山,方七百里,高萬仞。本在冀州之南,河陽之北....... ??嗯,按照慣例,第一句話就是騙你們點(diǎn)進(jìn)來的。在讀本文之前,希望你對(duì)Javascript的原型和原型鏈有一定了解,這有助于你更好的理解本文,之前有寫過一篇相關(guān)文章,點(diǎn)此...

    cartoon 評(píng)論0 收藏0
  • What's New in JavaScript

    摘要:在和中都保留了數(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); 前...

    cgh1999520 評(píng)論0 收藏0
  • JavaScript new 到底干了什么,跟原型鏈又有一些什么聯(lián)系?

    摘要:原文如果按面向?qū)ο蟮乃悸啡ブv的,還是很難去理解,我們可以從另一個(gè)方向去理解一下它。 原文:https://legacy.ofcrab.com/press/javascript-new.html 如果按面向?qū)ο蟮乃悸啡ブv JavaScript 的 new,還是很難去理解,我們可以從另一個(gè)方向去理解一下它。 你這些人類 我是一名程序員,也是一個(gè)人,我可能: 有一個(gè)響亮亮的名稱 在某一天出...

    Cympros 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<