瞭解javascript編程中的Prototype(原型)

日期:2012-5-16  來源:GBin1.comjavascript

瞭解javascript編程中的Prototype(原型)

當你定義javascript方法的時候,會產生一些預約義的屬性,其中一個比較讓人迷惑的屬性就是prototype。在本文中,咱們將詳細介紹什麼是Prototype,而且爲何使用prototype。java

什麼是prototype?

prototype屬性初始時是一個空的對象,能夠添加對象 ,你能夠添加任何對象到它裏面去。編程

var myObject = function(name){
    this.name = name;
    return this;
};
console.log(typeof myObject.prototype); // object
myObject.prototype.getName = function(){
    return this.name;
};

在以上這段代碼中,咱們建立了一個方法,可是若是咱們調用myObject(),將會返回window對象,由於它被定義在全局範圍中。 this將會返回全局對象,由於沒有被實例化。瀏覽器

console.log(myObject() === window); // true

祕密的鏈接

每個javascript中的對象都有一個祕密屬性。 app

在咱們繼續以前,我想討論一下決定prototype工做方式的「祕密」鏈接。this

每個javascript對象在定義或者實例化的時候都會添加一個祕密的屬性,叫__proto__,這決定了prototype鏈如何被訪問。然而,在你的應用中訪問這個__proto__屬性絕對不是一個好主意,由於不是全部瀏覽器均可訪問。spa

__prototype__ 屬性在一個對象的prototype中不該該被弄混了, 由於它有兩個分開的屬性;意味着他們都是手拉手來使用的。對於弄清楚這個很重要。由於最開始的時候確定比較使人迷惑。 那究竟什麼意思呢? 這裏咱們解析一下。 當咱們建立myObject方法時,咱們定義了一個Function類型的對象。prototype

console.log(typeof myObject); // function

若是你不知道的話, Function是一個javascript預約義的對象,這樣的話,擁有本身的屬性(例如,length和arguments)和方法(例如,call和apply)。這意味着,在javascript的引擎中,這裏有相似以下代碼的部分:code

Function.prototype = {
    arguments: null,
    length: 0,
    call: function(){
        // secret code
    },
    apply: function(){
        // secret code
    }
    ...
} 
固然可能沒有這麼簡單;不過這裏只是演示prototype的鏈式如何工做的。
所以當咱們定義myObject爲一個方法而且提供一個參數name;可是並不設置其它屬性和方法,例如length,和call,那麼以下代碼爲何能夠工做?
....
....
來源: 瞭解javascript編程中的Prototype(原型)
相關文章
相關標籤/搜索