原型對(duì)象概念
在構(gòu)造函數(shù)創(chuàng)建出來(lái)的時(shí)候,系統(tǒng)會(huì)默認(rèn)幫構(gòu)造函數(shù)創(chuàng)建并關(guān)聯(lián)的一個(gè)新對(duì)象
自定義構(gòu)造函數(shù)的原型對(duì)象默認(rèn)是一個(gè)空對(duì)象。
原型對(duì)象的作用
構(gòu)造函數(shù)中的原型對(duì)象中的屬性和方法可以被使用該構(gòu)造函數(shù)創(chuàng)建出來(lái)的對(duì)象使用。
即以自定義構(gòu)造函數(shù)方式創(chuàng)建出來(lái)的所有對(duì)象,自動(dòng)擁有和共享該構(gòu)造函數(shù)的原型對(duì)象中的所有屬性和方法。
如何訪問(wèn)構(gòu)造函數(shù)的原型對(duì)象
① 構(gòu)造函數(shù).protoType
② 對(duì)象.__proto__(不推薦)
設(shè)置原型對(duì)象的屬性和方法
① 利用對(duì)象的動(dòng)態(tài)特性來(lái)為構(gòu)造函數(shù)的原型對(duì)象添加屬性和方法
② 替換原型對(duì)象
原型對(duì)象的使用注意
實(shí)例和實(shí)例化
實(shí)例化:通過(guò)構(gòu)造函數(shù)創(chuàng)建具體對(duì)象的過(guò)程。
實(shí)例:通過(guò)構(gòu)造函數(shù)實(shí)例化出來(lái)的對(duì)象,我們稱(chēng)之為該構(gòu)造函數(shù)的一個(gè)實(shí)例。
注意:在說(shuō)實(shí)例的時(shí)候,一定要指定是某個(gè)具體構(gòu)造函數(shù)的實(shí)例
function Person() {
}
// 使用 new Person() 創(chuàng)建對(duì)象的過(guò)程稱(chēng)為實(shí)例化
// p1就是Person這個(gè)構(gòu)造函數(shù)的實(shí)例
var p1 = new Person();
原型的使用方法
① 利用對(duì)象的動(dòng)態(tài)特性給原型添加屬性|方法
如果要添加的方法過(guò)多,則有大量重復(fù)代碼
// 1.提供一個(gè)構(gòu)造函數(shù)
function Person() {
// this = obj;
this.name = '默認(rèn)';
}
// 2.設(shè)置原型對(duì)象的成員(屬性+方法)
// 添加成員
Person.prototype.des = 'des';
Person.prototype.logDes = function () {
console.log(this.des);
}
// 修改成員
Person.prototype.des = 'log';
var p1 = new Person();
// 刪除
delete p1.des;// 刪除的是p1自己的des屬性,無(wú)法刪除原型對(duì)象的屬性
delete Person.prototype.des;
② 直接替換原型對(duì)象
01 替換前后創(chuàng)建的對(duì)象所指向的原型對(duì)象不一致
02 替換原型對(duì)象會(huì)切斷和之前的原型對(duì)象之間的關(guān)系
原型對(duì)象的使用注意
① 訪問(wèn)屬性:構(gòu)造函數(shù)創(chuàng)建出來(lái)的對(duì)象在訪問(wèn)屬性的時(shí)候,會(huì)先在實(shí)例內(nèi)查找,如果沒(méi)有找到則進(jìn)一步到對(duì)應(yīng)的原型對(duì)象中查找
② 設(shè)置屬性:
在使用點(diǎn)語(yǔ)法進(jìn)行賦值的時(shí)候,無(wú)法操作到對(duì)應(yīng)的原型對(duì)象
如果該屬性在對(duì)象中已經(jīng)存在,則修改該屬性的值
如果該屬性在對(duì)象中尚未存在,則新增該屬性
③ 設(shè)置原型對(duì)象的屬性:
[01] 設(shè)置原型對(duì)象的屬性,只能通過(guò)構(gòu)造函數(shù).Prototype的方式|替換原型對(duì)象的方式設(shè)置
[02] 如果原型對(duì)象的屬性是值類(lèi)型,那么只能通過(guò)Person.prototype.屬性的方式修改其值
如果原型對(duì)象的屬性是引用類(lèi)型,那么可以通過(guò)對(duì)象名.引用對(duì)象.屬性名的方式設(shè)置|修改
(1) 使用構(gòu)造函數(shù)創(chuàng)建出來(lái)的多個(gè)對(duì)象的原型對(duì)象中的該屬性指向的是同一塊數(shù)據(jù)
(2) 某個(gè)對(duì)象對(duì)該原型對(duì)象屬性進(jìn)行了修改會(huì)影響到其他的對(duì)象
.proto屬性說(shuō)明
__proto__是一個(gè)非標(biāo)準(zhǔn)屬性
即ECMAScript中并不包含該屬性,這只是某些瀏覽器為了方便開(kāi)發(fā)人員開(kāi)發(fā)和調(diào)試而提供的一個(gè)屬性,不具備通用性
建議:在調(diào)試的時(shí)候可以使用該屬性,但不能出現(xiàn)在正式的代碼中
```
hasOwnProperty方法
- ①.in 判斷對(duì)象中是否存在指定的屬性(實(shí)例屬性+原型屬性)
屬性名 in 對(duì)象 - ②.hasOwnProperty 判斷對(duì)象中是否存在指定的實(shí)例屬性
- ③.判斷某個(gè)屬性是否是原型屬性,并且僅僅是原型屬性
1.屬性
2.不是實(shí)例屬性
function isPrototypeProperty(obj,objName) {
return objName in obj && !obj.hasOwnProperty(objName);
}
console.log(isPrototypeProperty(p1, 'name')); // false
console.log(isPrototypeProperty(p1, 'des')); // true
console.log(isPrototypeProperty(p1, 'age')); // false
isPrototypeOf方法
isPrototypeOf: 判斷一個(gè)對(duì)象是否是指定對(duì)象的原型對(duì)象
instanceof : 判斷一個(gè)對(duì)象是否指定構(gòu)造函數(shù)的實(shí)例對(duì)象
圖片發(fā)自簡(jiǎn)書(shū)App
