原型與原型鏈

2021-08-29 04:10:51 字數 2012 閱讀 6146

值型別(string,number,boolean,undefined)

function

person()

var p1 =

newperson()

;//p1即為建構函式person()的例項化物件

var arr =[10

,20,30

,40,50

,60]//這種語法糖形式的物件建立,是由array()函式建立簡化而來的。

這個過程種,系統做了什麼?

var p1 =

;p1.__proto__ = person.prototype;

person.

call

(p1)

;//初始化p1

//這個結論是可以通過p1.__proto__ === person.prototype反推的

__proto__(隱式原型):每建立乙個物件都會在其內部初始化乙個__proto__屬性,當我們訪問乙個物件的屬性的時候,如果物件內部不穿在這個屬性,系統就會去__proto__中尋找,這個__proto__作為乙個物件,又會有自己的__proto__,直到null。這就是我們所說的原型鏈概念

prototype(顯式原型):每建立乙個函式,就會同時在記憶體中分配得建立乙個prototype物件。預設的只有乙個constructor的屬性指向建構函式本身。

function

person()

person.prototype =

}var p =

newperson()

;console.

log(person)

;//不包含sayname()方法

console.

log(p)

;//sayname()方法可以從__proto__中獲取到

p.sayname()

;//輸出my name is tom

console.

log(p.__proto__.constructor)

;//結果等同於輸出person

function.prototype.a =

"a";

object.prototype.b =

"b";

function

person()

;console.

log(person)

;//function person()

let p =

newperson()

;console.

log(p)

;//person object

console.

log(p.a)

;//undefined

console.

log(p.b)

;//b

查詢屬性,如果本身沒有,則會去__proto__中查詢,也就是建構函式的顯式原型中查詢,如果建構函式中也沒有該屬性,因為建構函式也是物件,也有__proto__,那麼會去它的顯式原型中查詢,一直到null,如果沒有則返回undefined。

那麼問題來了,prototype派不上用場嗎?

使用原型物件拓展自定義屬性

person.prototype.email =

"[email protected]"

;

拓展陣列類的功能

var arr=[10

,20,30

,40,50

,60];

array.prototype.

saywhere

=function

(num)

}return-1

;}console.

log(arr.

saywhere(20

));

同第二條應用,拓展自定義的建構函式的功能,同時不影響在其他範圍內對該建構函式的影響。

原型與原型鏈

原型有兩種 1為顯示原型,2為隱式原型 1.顯示原型 a prototype b 每個函式都有乙個顯示原型prototype當然函式也有隱式原型 c 原型就是函式的乙個屬性,這個屬性名叫做prototype d 這個屬性即prototype的型別是object 2.隱式原型 a proto b 每個...

原型與原型鏈

圖中一共標了7條線,就一條一條的講,講完了就應該懂了 已知 1.函式是物件,原型也是物件 2.proto 每乙個物件都有,prototype是函式特有的 3.物件的 proto 屬性指向該物件建構函式的 原型 prototype 線1.物件f1的 proto 屬性指向其建構函式的原型 其建構函式 f...

原型與原型鏈

每個函式都有乙個prototype屬性,這個屬性是乙個指標,指向乙個物件,即原型物件。原型物件包含所有例項共享的屬性和方法。使用原型物件可以讓所有例項共享它所包含的方法。function person person.prototype.name ju person.prototype.sayname...