首頁  >  文章  >  web前端  >  JavaScript中一個比較難理解的概念--原型

JavaScript中一個比較難理解的概念--原型

零下一度
零下一度原創
2017-07-24 09:30:301479瀏覽

原型是JavaScript中一個比較難理解的概念,原型相關的屬性也比較多,物件有」prototype」屬性,函數物件有」prototype」屬性,原型物件有」constructor」屬性。

一、初識原型
在JavaScript中,原型也是一個對象,透過原型可以實現對象的屬性繼承,JavaScript的對像中都包含了一個”[[Prototype]]」內部屬性,這個屬性所對應的就是該物件的原型。
「[[Prototype]]」作為物件的內部屬性,是不能被直接存取的。所以為了方便查看一個物件的原型,Firefox和Chrome中提供了__proto__這個非標準(不是所有瀏覽器都支援)的存取器(ECMA引入了標準物件原型存取器」Object.getPrototype(object)」) 。在JavaScript的原型物件中,也包含一個”constructor」屬性,這個屬性對應到建立所有指向該原型的實例的建構子

二、規則
在JavaScript中,每個函數都有一個prototype屬性,當一個函數被用作建構函數來建立實例時,這個函數的prototype屬性值會被當作原型賦值給所有物件實例(也就是設定實例的`__proto__`屬性),也就是說,所有實例的原型引用的是函數的prototype屬性。 (****`只有函數物件才會有這個屬性!`****)

new 的過程分成三步驟  

?

## var p = new Person('張三',20);

   

#1. var p={}; 初始化一個物件p。

2. p._proto_=Person.prototype;,將物件p的__proto__ 屬性設為Person.prototype
3. Person.call(p,」張三」,20);呼叫建構子Person來初始化p。關於call/apply使用
舉例:

 
有下列場景
Man extends Person extends Object
 
var a = new Man();
#var a = new Man();
a的原型就是Man.prototype
 
Man.prototype也是一個對象,那麼它也有一個指標指向它自己的原型,那就是Person.prototype
 
同理,Person.prototype的原型就是Object.prototype
 
Object.prototype也是對象,同理,只不過它的原型為null,那麼也就到了原型鏈的末端
 
a的原型連結如下圖

 

 

 記住一點:物件的原型就是它的建構函數的原型,照樣拿上圖的a物件來舉例的話,也就是:a.__proto__ === Man.prototype

 ###

以上是JavaScript中一個比較難理解的概念--原型的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn