原型對象就是解決構造函數建立對象時的弊端。
每一個構造函數都有一個prototype屬性,這個屬性指向的就是原型對象
<script>
function Person(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
var ldh = new Person("liudehua", 26, "man");
console.log(ldh); //Person {name: "liudehua", age: 26, sex: "man"}
//每一個執行個體對象都有constructor屬性,指向産生這個執行個體的構造函數,這句是錯的
// 每一個執行個體對象都有constructor屬性,其實通路的是原型對象上的constructor。
//原型最初隻包含constructor屬性,而該屬性也是共享的,是以可以通過對象執行個體通路。
console.log(ldh.constructor === Person) //true
// Person.prototype.nike = "chuohoa"
//工廠函數的弊端,構造函數來解決,構造函數的弊端原型對象來解決
//列印原型對象
console.log(Person.prototype);
// 原型對象中有constructor,指向構造函數
console.log(Person === Person.prototype.constructor); //true
// 調用構造函數建立一個新執行個體後,
// 該執行個體的内部将包含一個指針(内部屬性),
// 指向構造函數的原型對象。
// ECMA-262第5版中管這個指針叫[[Prototype]]。
// 雖然在腳本中沒有标準的方式通路[[Prototype]],
// 但Firefox、Safari和Chrome在每個對象上都支援一個屬性__proto__
console.log(Person.prototype === ldh.__proto__)
//__proto__,這個連接配接存在于執行個體與構造函數的原型對象之間,
// 而不是存在于執行個體與構造函數之間
// ldh.__proto__指向的是原型對象
console.log(ldh.__proto__.constructor === Person) //true
//ECMAScript 5增加了一個新方法,叫Object.getPrototypeOf(),
//在所有支援的實作中,這個方法傳回[[Prototype]]的值
//說人話:也就是指向了原型對象呗,原型對象就是構造函數和執行個體之間的橋梁。
console.log(Object.getPrototypeOf(ldh) == Person.prototype)//true
</script>
