JavaScript中的原型!
原型的內容是涉及到JavaScript中的構造函數的
每個構造函數都有一個原型對象!prototype
他的做用是 共享方法!
每個實例化的對象都有一個對象原型__proto__
他指向的是構造函數的原型對象
因此咱們建立的實例對象可使用對象原型中的方法!
__proto__對象原型和原型對象prototype是等價的
__proto__對象原型的意義就在於爲對象的查找機制提供一個方向,或者說一條路線,可是它是一個非標準屬性,所以實際開發中,不可使用這個屬性,它只是內部指向原型對象prototype
看不見我, 看不見我,看不見我!
構造函數!
對象原型(proto)和原型對象(prototype)裏面都有一個constructor屬性!, constructor咱們稱之爲構造函數, 由於它指回構造函數自己!
constructor主要用於記錄該對象引用於哪一個構造函數,它可讓原型對象從新指向原來的構造函數
<script>
// 構造函數的問題!
function Gouzaohanshu(name, age, gender) {
this.name = name;
this.age = age;
this.gender = gender;
// this.hanshu = function() {
// console.log(123)
// }
}
// 把構造函數放到咱們的原型對象身上!
// Gouzaohanshu.prototype.hanshu = function () {
// console.log(123)
// }
//不少狀況下,咱們須要手動的利用 constructor這個屬性指固原來的構造函數
// Gouzaohanshu.prototype.sleep = function() {
// console.log("我想睡覺!")
// }
// 若是對象比較多, 那麼咱們就能夠採起對象的形式存儲!
// 可是若是你這樣作的話會把原先的原型對象給覆蓋了!
// 原先的原型對象就不會指向上面的構造函數了!
// 解決方法
// 在下面的對象中添加這樣一句代碼!
// construtor: Gouzaohanshu,
// 就可讓構造函數指回他的自己了!
// 一句話, 若是咱們修改了原來的原型對象, 給原型對象賦值是一個對象, 則必須手動的利用constructor 指回原來的構造函數!
Gouzaohanshu.prototype = {
construtor: Gouzaohanshu,
hanshu() {
console.log(123)
},
sleep: function() {
console.log("我想睡覺!")
}
}
var gz = new Gouzaohanshu('lvhang', 23, 'nan');
// 在咱們建立的對象身上也有一個對象叫作!
// __prototype__ 叫作對象的原型!
// 它指向咱們構造函數的原型對象!
var gz2 = new Gouzaohanshu('lvhang', 23, 'nan');
gz.hanshu()
// __proto__對象的原型和原型對象prototype是等價的
console.log(gz.__proto__ === Gouzaohanshu.prototype); // true
// 方法的查找規則:首先先看gz對象身上是否有hanshu方法,若是有就執行這個對象上的hanhsu方法
// 若是沒有這個方法,由於有__proto__,就去構造函數原型對 Prototype身上去查找
// constructor主要用於記錄該對象引用於哪一個構造函數,它可讓原型對象從新指向原來的構造函數
console.log(gz.__proto__);
console.log(Gouzaohanshu.prototype);
</script>