Javascript面向對象精要讀書筆記

Javascript面向對象精要讀書筆記

一、下面代碼的實際執行過程是什麼?javascript

var name = 'fan'
var str = name.charAt(0)     
console.log(str)
var name = 'fan'
var temp = new String(name)
var str = temp.charAt(0)
temp = null
console.log(temp)

二、使用原始值和原始封裝類型是有區別的java

var flag = new Boolean(false)
if(flag){
    console.log(flag)
}

由於flag是被解析成一個對象的,因此確定是真的git

三、函數是對象,函數有兩種字面形式,第一種是函數聲明,以function關鍵字開頭後面跟函數名字。github

function add(){
    //...
}

第二種形式是將函數做爲一個值賦值給變量數組

var add = function(){
    
}

函數聲明會被提高到上下文頂部,能夠先使用再定義app

var result = add()
function add(){
    //...
}

而函數表達式僅能經過變量引用,所以是沒有辦法提高的。因此下面會報錯函數

var result = add()
var add = function(){
    //...
}

四、函數的length屬性表示該函數的指望參數個數,實現一個函數,求其接受任意數量的參數並返回他們的和this

function sum(){
    var result = 0,
        i = 0,
        l = arguments.length
    while(i < l){
        result += arguments[i]
        i++
    }
    return result
}

五、函數重載的理解,下面的函數輸出什麼?並解釋下。code

function sayHello(name){
    console.log(name)
}

function sayHello(){
    console.log('default msg')
}

sayHello('fan')

解釋:對象

var sayHello = new Function('name', 'console.log(name)')

var sayHello = new Function("console.log('default')")

sayHello('fan')

能夠利用參數的個數來模擬函數的重載

六、改變函數的this。

一、call()方法

function sayHi(context){
    console.log(context + ':' + this.name)
}

var person1 = {
    name: 'fanchao'
}

var person2 = {
    name: '陳冠希'
}

var name = '小姐姐'

sayHi.call(this, 'global')
sayHi.call(person1, 'person1')
sayHi.call(person2, 'person2')

這裏是顯示的指定this的值,並非讓javascript引擎去自動指定this

二、apply()方法

function sayHi(context){
    console.log(context + ':' + this.name)
}

var person1 = {
    name: 'fanchao'
}

var person2 = {
    name: '陳冠希'
}

var name = '小姐姐'

sayHi.apply(this, ['global'])
sayHi.apply(person1, ['person1'])
sayHi.apply(person2, ['person2'])

apply基本上和call的方式是同樣的,就是接受的第二個參數不同,是以數組的形式傳入函數的,call是須要有多少就要以展開的方式傳入參數例如:

xxxxFun.call(xxObj, param1,param2,...)

三、bind()方法

bind方法是ECMAscript 5中的方法,和以前的call和apply有點不同

function sayHi(context){
    console.log(context +  ':' + this.name)
}

var person1 = {
    name: 'fanchao'
}

var person2 = {
    name: '陳冠希'
}

//爲person1建立一個方法sayHiPerson1
var sayHiPerson1 = sayHi.bind(person1)
sayHiPerson1('person1')

// 爲person2建立一個方法sayHiPerson2
var sayHiPerson2 = sayHi.bind(person2,'person2')
sayHiPerson2()
// 由於this已經綁定給了person1,因此name仍是person1的
person2.say = sayHiPerson1
person2.say('person2')

sayHiPerson1方法沒有綁定參數,因此本身仍是要在調用的時候傳參數

sayHiPerson2不只綁定了this指向還綁定了第一個參數。參數的綁定相似call方法。
一個好的食用連接,給個star唄

相關文章
相關標籤/搜索