js高階整理

2021-10-12 21:40:40 字數 4014 閱讀 7200

var stu=

}

工廠方式建立

var stu1=

student

('zs',20

);var stu2=

student

('ls',13

);

建構函式方式

// 如果是建構函式,函式名一般大寫。

function

student

(name,age)

}// 例項化物件

var stu=

newstudent

('zs',20

);var stu2=

newstudent

('ls',18

)stu2.

eat(

);

注意: 在該建構函式中,student函式每次例項化物件的時候,都會生成乙個eat方法。造成資源的浪費

每乙個建構函式,都有乙個prototype屬性/物件,該屬性的所有方法和屬性都能被建構函式繼承。

this指向問題:

var stu=

function

add(a,b)

// add(1,2);

// fn.call(所要指向的物件,引數1,引數2,...) 呼叫fn函式。修改this指向

add.

call

(stu,1,

3);// fn.call(所要指向的物件,[引數1,引數2,...]) 呼叫fn函式。修改this指向

add.

(stu,[1

,2])

;// bind不會直接呼叫函式 返回乙個新的函式 修改了this指向

var fn=add.

bind

(stu,1,

2);fn

();

function

product

(name)

product.prototype=

}var p=

newproduct

('手機'

)console.

log(product.prototype);//

console.

log(p.constructor==product)

;//true

prototype是函式才有的屬性

__proto__是每個物件都有的屬性,但不是規範屬性,部分瀏覽器可實現

例如:var a =

;console.

log(a.prototype)

;//undefined

console.

log(a.__proto__)

;//object {}

varb

=function()

console.

log(b.prototype)

;//b {}

console.

log(b.__proto__)

;//function() {}

__proto__只取決於物件建立時實現方式

構造器方式

vara

=function()

;var a =

newa()

;console.

log(a.__proto__)

;//a {}

console.

log(a.__proto__ === a.constructor.prototype)

;//true

原型鏈查詢

vara

=function()

;var a =

newa()

;console.

log(a.__proto__)

;//a {}(即構造器function a 的原型物件)

console.

log(a.__proto__.__proto__)

;//object {}(即構造器function object 的原型物件)

console.

log(a.__proto__.__proto__.__proto__)

;//null

var circle=

,set

acr(value)

}// 如果是賦值,自動呼叫set方法

circle.acr=

100;

// 如果是獲取值,自動呼叫get方法

console.

log(circle.acr)

;

var stu=

// 正常賦值,屬性可以直接修改

stu.name=

'小明'

;// 屬性可以被遍歷出來

// for (var i in stu)

// 一般特殊情況才這樣使用。

// 設定屬性的時候,可以配置屬性特徵

object.

defineproperty

(stu,

'password',)

// 修改不成功,但是不會報錯。writeable false

stu.password=

456;

console.

log(stu.password)

;// 不能被遍歷 enumerable是false

for(

var i in stu)

// 'password' 不能被重新配置 會報錯

object.

defineproperty

(stu,

'password'

,)

//如果乙個變數宣告,會把宣告提公升到整個作用域的最前面,賦值還是在原來的位置

/*console.log(a);

var a=10;

//等價於

var a;

console.log(a);

a=10;*/

//如果變數沒有宣告,作用域是賦值以後的區域

//報錯a 沒有宣告在賦值之前沒有辦法直接使用

console.

log(a)

a=10

;//通過該方法定義函式,會把整個函式提公升到作用域最前面。

add(

)function

add(

)

作用域:在js中只有函式的作用域,在函式內部宣告的變數,才能稱為區域性變數

全域性和區域性只是相對來說

作用域鏈:在某個作用域內使用變數的時候,首先會在該作用域內尋找該變數,如果沒有,會一直向上尋找。這樣的一種鏈式關係就是作用域鏈。其實指的就是變數的就近原則。

function

deepcopy

(obj)

console.

log(objclone)if(

typeof obj===

"object"

)else}}

}return objclone

}

//閉包擴大了變數作用域

functionfn(

)}var fn1=fn(

)fn1(1

,2)//閉包:縮小了變數作用域,防止變數汙染

(function()

);console.

log(m)

//函式作為函式的實參。就是高階函式

function

add(time,color)

,time)

}add

(1000

,function()

)add

(2000

,function()

)

JS高階教程知識整理 13繼承模式

01.原型鏈繼承 方式一 原型鏈繼承 1.套路 1.定義父型別建構函式 2.給父型別的原型新增方法 3.定義子型別建構函式 4.建立父型別的物件賦值給子型別的原型 5.將子型別的構造屬性設定為子型別 6.給子型別原型新增方法 7.建立子型別的物件,可以呼叫父型別的方法 2.關鍵 1.子型別的原型為父...

《高階程式設計》整理

在喜馬拉雅上聽了沙翼的 高階程式設計 的音訊課程,記錄了一些題目當做整理複習用 q1 js區分大小寫,html和css不區分大小寫。那麼請問,js在html中是否區分?a onclick不區分,triggerclick區分 q2 漢字是否可以作為變數名 可以,但不推薦 q3 分號是否為必寫的?不是。...

JS高階教程知識整理 07函式中的this

1.this是什麼 任何函式本質上都是通過某個物件來呼叫的,如果沒有直接指定就是window 所有函式內部都有乙個變數this 它的值是呼叫函式的當前物件 2.如何確定this的值 test window new test 新建立的物件 p.test p p.call obj obj 實現 lang...