值型別(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 =
;
拓展陣列類的功能
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...