面向?qū)ο笾蛯?duì)象和其他補(bǔ)充

原型對(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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容