iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 23
0
Modern Web

30天入門JavaScript系列 第 23

【Day 23】物件(三):prototype跟__proto__

  • 分享至 

  • xImage
  •  

前幾天提到了this的好處就是可以讓多的物件使用同一個函式

但看下面的程式

function People(name, age) {
  this.name = name;
  this.age = age;
  this.say = function () {
    console.log('你好我叫做' + name + ',我今年' + this.age);
  };
}
var person1 = new People('Jonn', 25);
var person2 = new People('Mary', 20);

person1.say();
person2.say();

使用建構器函式來加入方法時,會變成每個物件內都有各自的方法,
這樣就沒發揮到使用this能讓多個物件共同使用單個方法的優點。

而且目前只有兩個物件,以後有更大量物件時這種重復的方法會很浪費記憶體空間

這時候可以利用原型來解決這問題,
來看跟原型相關的兩個內建屬性(就是不需要我們定義,內建的隱藏屬性):

__proto__:

物件都會有的內部屬性,會指向該物件的原型,當使用物件內部沒有的屬性或方法時,
會往__proto__指向的物件去尋找

prototype:

函式內會有的內部屬性,會指向一個物件(以下稱作原型物件),當該函式當作建構器函式呼叫時,
建立的新物件__proto__屬性會指向該函式的原型物件

這兩個屬性的關係像這樣:

function Obj() {}
var o = new Obj();
console.log(o.__proto__ === Obj.prototype);//true

所以只要在建構器函式的原型物件的內部新增屬性或方法,該函式建立的物件都能藉由原型來存取到
能可以將一開始的程式碼改成這樣

function People(name, age) {
  this.name = name;
  this.age = age;
}
People.prototype.say = function () {
  console.log('你好我叫做' + this.name + ',我今年' + this.age);
};

var person1 = new People('Jonn', 25);
var person2 = new People('Mary', 20);

person1.say();
person2.say();

People.prototype指向的原型物件內新增一個say()方法

People建立的person1跟person2在物件內部找不到say()方法,
會藉由__proto__找到People.prototype內部的say()方法來呼叫,
這樣不管建立了多少個物件,都能使用同一個方法


生病中,腦袋當機講話語無倫次,非常抱歉/images/emoticon/emoticon46.gif
解說圖跟詳細點的說明等身體等好一點再補


上一篇
【Day 22】this(二):bind()、call()、apply(),箭頭函式
下一篇
【Day 24】物件(四):原型鍊
系列文
30天入門JavaScript30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言