想瞭解原型和原型鏈,我覺得首先我們得知道javascript里有一個Object 與 Function,它倆都是構造函數,當然函數也是一個對象。我們列印Object 與 Function看一下, 那麼這個Object 與 Function 之間有何關係與區別呢?首先您只需要記住: 1. 所有普通對象 ...
想瞭解原型和原型鏈,我覺得首先我們得知道javascript里有一個Object 與 Function,它倆都是構造函數,當然函數也是一個對象。我們列印Object 與 Function看一下,
console.log(Function)
console.log(Object)
那麼這個Object 與 Function 之間有何關係與區別呢?首先您只需要記住:
1. 所有普通對象都是 Object 的實例(也就是說Object是所有普通對象的爸爸);
2. 所有普通函數都是 Function 的實例(也就是說Function是所有普通函數的爸爸);
3. Function是 Object 的實例;(Object是所有對象的爸爸)
構造函數與原型對象的區別:
Object是構造函數,而Object.prototype是構造函數的原型對象。構造函數自身的屬性和方法無法被共用,而原型對象的屬性和方法可以被所有實例對象所共用。
其次,constructor屬性是原型對象上的一個屬性,可以被所有實例對象所共用。要註意的是,prototype是構造函數的屬性,而constructor則是構造函數的prototype屬性所指向的那個對象,也就是原型對象的屬性。由於constructor屬性是一種原型對象和構造函數的關係,所以在修改原型對象的時候,一定要註意constructor的指向問題。
接下來我們說重點,javascript里的__proto__ 和 prototype 屬性。
1. 所有的對象都有__proto__ 屬性,可通過__proto__屬性來訪問這個對象的原型,而 __proto__ 指向的是它原型對象的prototype 屬性(對象沒有prototype屬性);
2. 所有的構造函數都有一個prototype 和 __proto__ 屬性,而該函數的prototype屬性指向的是它原型對象上的constructor屬性。
代碼實例:
var A = function () {} // 申明一個函數對象A;
var B = new A(); // 為A創建一個實例B;
console.log("A.prototype:", A.prototype);
console.log("B.__proto__:", B.__proto__);
console.log(A.prototype === B.__proto__);
Prototype 的作用:
可以為原型的實例設置公用的屬性或方法;
var A = function () {
this.ary1 = [];
}
var B = new A();
var C = new A();
B.ary1.push(1);
C.ary1.push(2);
console.log(B.ary1)
console.log(C.ary1)
A.prototype.ary2 = [];
B.ary2.push(1);
C.ary2.push(2);
console.log(B.ary2);
最後總結下什麼是原型鏈:
所有的對象都有一個__proto__屬性,我們通過對象的__proto__屬性一層層的向上訪問,最終會得到值null;那麼我們訪問的整個路徑就是這個對象的原型鏈。
(感覺個人理解還是不夠深刻,這裡只是記錄一下自己目前對於原型鏈的理解,多多指教!)