
函數(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)建流程,那我這里就簡述一下流程:
- 創(chuàng)建一個(gè)新對象,它的__proto__屬性指向 Foo.prototype (這個(gè)之前在繼承一章中講過)
- 使用指定的參數(shù)調(diào)用Foo構(gòu)造函數(shù)(其實(shí)就是Foo函數(shù)),并將this綁定到新的對象上
- 如果在函數(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]