在javascript中,當系統載入構造函授後 ,會自動在記憶體中增加一個對象,這個對象就是原型對象。構造函數和原型對象在記憶體中表現為相互獨立,但兩者之間還存在聯繫,構造函數的prototype是原型對象,而原型對象的constructor是構造函數。 創建對象的方法 字面量、構造函數、Object. ...
在javascript中,當系統載入構造函授後 ,會自動在記憶體中增加一個對象,這個對象就是原型對象。構造函數和原型對象在記憶體中表現為相互獨立,但兩者之間還存在聯繫,構造函數的prototype是原型對象,而原型對象的constructor是構造函數。
創建對象的方法
字面量、構造函數、Object.create
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>創建對象</title>
</head>
<script>
// <!-- 創建對象 -->
// 字面量
var obj1 = {"name": "o1"};
var obj2 = new Object({"name": "o2"});
// 構造函數
var F = function(name){ this.name = name};
var obj3 = new F('o3');
// Object.create
var obj4 = Object.create({name:'o4'});
</script>
<body>
</body>
</html>
prototype與__proto__
函數才有prototype屬性,對象沒有這個屬性;
但是函數有__proto__這個屬性,因為函數也屬於對象,只要是對象就有__proto__這個屬性,只不過函數的__proto__是Function.prototype。
請看下圖:
實例、構造函數、原型對象
從上圖可以看出:
1.實例是通過new一個構造函數生成的;
2.構造函數的prototype跟new出來的實例的__proto__是同一個原型對象;
3.原型對象的constructor屬性指向的是構造函數;
4.原型對象也是對象,也有__proto__,它的__proto__還是原型對象
原型對象與實例的關係
實例是原型對象的constructor屬性(構造函數)new出來的一個對象。
一個構造函數可以通過傳不同的參數new出很多個實例,但是如果想給實例添加方法的話就要在每一個實例里都寫一遍,會很麻煩,有了原型對象,就可以方便很多,可以在原型對象中寫好方法,new出來的實例自然也有原型中的方法。
原型鏈
從以上幾項的關係圖中就可以看出什麼是原型鏈,原型鏈就是由原型組合成的一個鏈條,對象的__proto__是原型對象,原型對象本質也是對象,所以原型對象也有__proto__,這樣一直往上找__proto__,
直到找到__proto__:Object時就結束了。
以上就是有關原型對象和原型鏈的一些知識,有寫的不對的地方歡迎大家指正!