前幾天提到了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()
方法來呼叫,
這樣不管建立了多少個物件,都能使用同一個方法
生病中,腦袋當機講話語無倫次,非常抱歉
解說圖跟詳細點的說明等身體等好一點再補