七、function何其擾之--對象

javascript編入集

函數(shù)對象,函數(shù)對象。前一章講函數(shù),這一章講講對象。函數(shù)時(shí)候還是比較嚴(yán)肅的講說,畢竟有一等公民在,不能隨便放肆?,F(xiàn)在講對象了,反倒是放開了。
大駝峰帕斯卡命名,通常就是“作為”對象了。像什么Object,String云云。但凡是對象,總要new的。坊間開個(gè)玩笑說,今年過節(jié)又沒有對象吧,自己給自己new一個(gè)不就完事了,誰叫js是面向?qū)ο缶幊痰哪亍?br> 言歸正傳,下面就定義一個(gè)對象來:

function Foo (){ }

不知道為什么要選foo,可能因?yàn)閯e的示例也用foo吧,就照貓畫虎的用了,反正是沒有版權(quán)的。
這個(gè)乍一看和函數(shù)是一樣的,沒錯(cuò),他就是和函數(shù)一樣的。只是因?yàn)槊系娜藶閰^(qū)分,所以主觀上分成了兩類,一類叫函數(shù)一類叫對象。實(shí)際上他們都是Function。

作為對象,自然要new出來的:

var foo = new Foo(); 
var foo2 = new Foo;

提示:在無參數(shù)情況下,使用new Foo() 和new Foo 是等同行為,但是如果是普通的函數(shù)調(diào)用就不可以了。

new 操作符標(biāo)準(zhǔn)中,敘述了具體創(chuàng)建流程,那我這里就簡述一下流程:

  1. 創(chuàng)建一個(gè)新對象,它的__proto__屬性指向 Foo.prototype (這個(gè)之前在繼承一章中講過)
  2. 使用指定的參數(shù)調(diào)用Foo構(gòu)造函數(shù)(其實(shí)就是Foo函數(shù)),并將this綁定到新的對象上
  3. 如果在函數(shù)內(nèi)部有return值,則使用新的值作為返回值,否則使用 1 創(chuàng)建的對象作為返回值。

這三步,完全解釋了一個(gè)函數(shù)轉(zhuǎn)對象的具體流程。

我們按照這個(gè)規(guī)則可以自己仿照一個(gè)函數(shù)構(gòu)造過程:

function Template(name){   
        this.name=name;
}
var b = {};
b.__proto__ = Template.prototype;
b.constructor = Template;
var tempObj = Template.call(b,'templateB');
if( tempObj != undefined ){
      b = tempObj ;
}

雖然實(shí)際上并不是這么簡單的構(gòu)造,但是的確可以仿造出一個(gè)new對象來。

再說一下this

上一章函數(shù)結(jié)尾說了this,這一章同樣要說一下this,畢竟我們在Template里面也是用了this。
這里用到了一個(gè)函數(shù) call。這個(gè)函數(shù)就是執(zhí)行并更改this指向的操作。

call這個(gè)函數(shù)來自于 Function.prototype.call

第一個(gè)參數(shù)代表 : this所指向的對象,
其余參數(shù)代表:函數(shù)本身執(zhí)行時(shí)所需要的參數(shù)了,如果沒有參數(shù),自然是不需要的。

同樣操作的還有apply來自于Function.prototype.apply

第一個(gè)參數(shù)代表 : this所指向的對象,
第二個(gè)參數(shù)代表:是一個(gè)數(shù)組,按數(shù)組元素順序傳遞函數(shù)本身所需的參數(shù),如果沒有參數(shù),自然是不需要的

還有一個(gè)只綁定不執(zhí)行的bind來自于Function.prototype.bind

第一個(gè)參數(shù)代表 :this所指向的對象,
其余參數(shù)代表 :當(dāng)函數(shù)被執(zhí)行時(shí)所優(yōu)先傳遞的參數(shù)內(nèi)容,
摘自MDN的bind

function list() {
  return Array.prototype.slice.call(arguments);
}

var list1 = list(1, 2, 3); // [1, 2, 3]

// Create a function with a preset leading argument
var leadingThirtysevenList = list.bind(null, 37);

var list2 = leadingThirtysevenList(); 
// [37]

var list3 = leadingThirtysevenList(1, 2, 3);
// [37, 1, 2, 3]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,654評論 19 139
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券,享受所有官網(wǎng)優(yōu)惠,并抽取幸運(yùn)大...
    HetfieldJoe閱讀 3,086評論 4 14
  • 函數(shù)和對象 1、函數(shù) 1.1 函數(shù)概述 函數(shù)對于任何一門語言來說都是核心的概念。通過函數(shù)可以封裝任意多條語句,而且...
    道無虛閱讀 4,959評論 0 5
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券,享受所有官網(wǎng)優(yōu)惠,并抽取幸運(yùn)大...
    HetfieldJoe閱讀 7,007評論 15 54
  • 把小朋友的每個(gè)方面的發(fā)展分開來看,是很不科學(xué)的。因?yàn)樾∨笥训陌l(fā)展是一個(gè)整體,而不是分裂開來。在學(xué)習(xí)剪紙的同時(shí),可以...
    暖暖加油閱讀 569評論 0 0

友情鏈接更多精彩內(nèi)容