1. 程式人生 > 其它 >【JS】用女媧造人來理解原型物件

【JS】用女媧造人來理解原型物件

一、JS的一個特點
可以動態的給物件新增屬性或者方法

let obj = {} //定義了一個空物件
console.log(obj)
obj.name = "瑪瑪哈哈" //新增屬性
obj.test = function() {
        console.log("我是瑪瑪哈哈哈哈哈哈哈")
    } //新增方法
console.log(obj)

在這裡插入圖片描述
二、原型物件

function fun() {}; //定義一個函式物件
let ff = new fun(); //例項化函式物件
console.log(ff);

在這裡插入圖片描述
從上圖我們可以看出,函式有一個__proto__屬性,這個屬性下面有一個constructor屬性,constructor屬性又指向函式物件fun。

原型物件:(fun.prototype) 函式的prototype所指向的物件
原型物件中有一個constructor屬性,它指向函式物件

在這裡插入圖片描述
設函式物件的名稱為fun,fun有一個屬性,名為__proto__,其值指向fun的原型物件fun.prototype。然後fun.prototype下有一個屬性,名為constructor,其值指向fun函式,即建構函式和它的原型物件相互引用。

相互引用(個人理解)
小紅手裡有一個本子(屬性),裡面記著小明的號碼,小紅可以通過這個本子聯絡到小明;小明手裡同樣有一個本子(但不是同一本),裡面也有小紅的號碼,小明也可以通過這個本子找到小紅。

原型的作用


函式的所有例項物件自動擁有原型中的屬性或者方法
給原型物件新增屬性(一般新增方法)是為了給例項物件使用。

以女媧造人為例,女媧造了一個泥潭(定義函式物件),然後開始造人,造出了小明,小紅,小白(建立了三個例項),但是這仨都不會說話,女媧只好一個一個教,先教小紅說話(動態新增自定義方法,即小紅.說話=function(){}),然後又去教小明說話,然後到教小白的時候呢,女媧就想,我這樣一個個教,要教到什麼時候,哪還有時間甩泥巴呢!乾脆我往泥巴里加點料(給原型新增方法),讓這群泥崽子造出來的時候就自己會說話,不用我教,這多好呀~然後女媧就往泥巴里撒了些灰,再用藤條沾上泥漿,一甩,漫山遍野的人類被造出來了,都喊著女媧“娘啊娘啊”,女媧欣慰的笑了,終於不用教他們說話了。

上面的例子可以用程式碼表示為:

function CreateHuman() {} //定義函式物件
let xiaohong = new CreateHuman(); //創造了小紅
let xiaoming = new CreateHuman(); //造了小明
let xiaobai = new CreateHuman(); //小白
//教小紅說話
xiaohong.speak = function() {
    console.log("小紅會說話啦");
}
xiaohong.speak(); //小紅說話
xiaoming.speak(); //小明和小白還不會說話,所以報錯
xiaobai.speak();

在這裡插入圖片描述

function CreateHuman() {} //定義函式物件
let xiaohong = new CreateHuman(); //創造了小紅
let xiaoming = new CreateHuman(); //造了小明
let xiaobai = new CreateHuman(); //小白
//教小紅說話
xiaohong.speak = function() {
    console.log("小紅會說話啦");
}
xiaohong.speak(); //小紅說話
//然後繼續教小明和小白說話
xiaoming.speak = function() {
    console.log("小明會說話啦");
}
xiaobai.speak = function() {
    console.log("小白會說話啦");
}
xiaoming.speak(); //小明說話
xiaobai.speak(); //小白說話

在這裡插入圖片描述

//此時女媧陷入了沉思,決定往泥潭裡撒灰
CreateHuman.prototype.speak = function() {
    console.log("我天生會說話哦");
};
//重新造人
let lrj = new CreateHuman;
lrj.speak(); //路人甲說話
let lry = new CreateHuman;
lry.speak(); //路人乙說話

在這裡插入圖片描述
然後看一下函式物件CreateHuman的原型物件

function CreateHuman() {} //定義函式物件
CreateHuman.prototype.speak = function() {
    console.log("我天生會說話哦");
};
console.log(CreateHuman.prototype);

在這裡插入圖片描述
多了一個speak方法,這就是給原型新增方法的作用。女媧不用一個一個的教人啦!