對(duì)象的屬性、方法

一阀湿、對(duì)象實(shí)例的屬性和方法

對(duì)象實(shí)例常用的屬性赶熟、方法如下:

名稱 描述 參數(shù) 返回 屬性/方法
constructor (1)保存當(dāng)前對(duì)象的構(gòu)造函數(shù) ,指向原始的 Object() 函數(shù)炕倘;
(2)一個(gè)類可有多個(gè)構(gòu)造函數(shù)钧大,可根據(jù)參數(shù)個(gè)數(shù)不同或參數(shù)類型不同去區(qū)分
/ / 屬性
hasOwnProperty(propertyName) 用來(lái)判斷該屬性是否在當(dāng)前對(duì)象實(shí)例中,而不是在對(duì)象的原型鏈中 接收一個(gè)字符串參數(shù)表示屬性名 boolean 方法
isPrototypeOf(obj) 判斷當(dāng)前對(duì)象 是否在 傳入的對(duì)象的原型鏈上 接收一個(gè)對(duì)象 boolean 方法
propertyIsEnumerable(prototypeName) 判斷該屬性是否可被 for...in 枚舉 接收一個(gè)屬性 boolean 方法
toString() 返回對(duì)象的字符串表示 / String 方法
valueOf() 返回對(duì)象的原始值 / / 方法

以下是具體是使用方法:
1罩旋、constructor

let person = {
    name: '大大的小小小心愿', 
    age: '25'
}
console.log(person);             // obj
console.log(person.constructor); // function String

2啊央、hasOwnProperty(propertyName)

let person = {
    name: '大大的小小小心愿', 
    age: '25'
}
let arr1 = [];
console.log(person.hasOwnProperty("age"))            // true
console.log(person.hasOwnProperty("hasOwnProperty")) // false
console.log(arr1.hasOwnProperty("length"))           // true

3、isPrototypeOf(obj)

    function MyObject3(){};
    let obj3 = new MyObject3();
    console.log(Object.prototype.isPrototypeOf(obj3));                     // true
    let obj33333 = {}
    console.log('obj33333 ===', Object.prototype.isPrototypeOf(obj33333)); // true

4涨醋、propertyIsEnumerable

   let obj4 = {
        name:'objName'
    }
    for (const key in obj4) {
        console.log(key);  // name
    }
    console.log(obj4.propertyIsEnumerable("name"));        // true
    console.log(obj4.propertyIsEnumerable("constructor")); // false

5瓜饥、toString()

    let obj5 = {};
    let date5 = new Date();
    console.log(obj5.toString());   // '[object Object]'
    console.log(date5.toString());  // 'Tue Oct 22 2019 11:07:10 GMT+0800 (中國(guó)標(biāo)準(zhǔn)時(shí)間)'

6、valueOf()

    let obj6 = {
        name:'obj6'
    }
    let val6 = [1];
    const date6 = new Date();
    console.log(obj6.valueOf());  // {name: "obj6"}
    console.log(val6.valueOf());  // [1]
    console.log(date6.valueOf()); // 1571713630704


二浴骂、屬性的類型

  • 分類:JavaScript 中屬性分為兩種 - 數(shù)據(jù)屬性乓土、訪問(wèn)器屬性;
  • 特性:ES5定義的描述屬性的各種特征溯警,是內(nèi)部值無(wú)法直接訪問(wèn)趣苏;
  • 區(qū)別:
    數(shù)據(jù)屬性 - 擁有 Get、Set 方法梯轻,無(wú) [[Writable]]食磕、[[Value]] 兩個(gè)特性
    訪問(wèn)器屬性 - 擁有 [[Writable]]、[[Value]] 兩個(gè)特性喳挑,無(wú) Get彬伦、Set 方法


1、屬性的特性:用兩對(duì)中括號(hào)表示 ( [[ ]] )
名稱 描述 默認(rèn)值 備注
[[Configurable]] 表示是否可以通過(guò) delete 操作符來(lái)刪除屬性 true /
[[Enumerable]] 表示是否能通過(guò) for...in 語(yǔ)句枚舉 實(shí)例默認(rèn)為 true伊诵,原型鏈中默認(rèn) false /
[[Writable]] 表示 屬性值是否可以修改 true 數(shù)據(jù)屬性特性
[[Value]] 表示 屬性的名稱 undefined 數(shù)據(jù)屬性特性
[[Get]] 讀取屬性時(shí)調(diào)用的函數(shù) undefined 訪問(wèn)器屬性特性
[[Set]] 寫入屬性時(shí)調(diào)用的函數(shù) undefined 訪問(wèn)器屬性特性


2单绑、讀取、操作特性

1曹宴、特性:

名稱 描述 參數(shù) 備注
[[Configurable]] 表示是否可以通過(guò) delete 操作符來(lái)刪除屬性 true /
[[Enumerable]] 表示是否能通過(guò) for...in 語(yǔ)句枚舉 實(shí)例默認(rèn)為 true搂橙,原型鏈中默認(rèn) false /
[[Writable]] 表示 屬性值是否可以修改 true 數(shù)據(jù)屬性特性
[[Value]] 表示 屬性的名稱 undefined 數(shù)據(jù)屬性特性
[[Get]] 讀取屬性時(shí)調(diào)用的函數(shù) undefined 訪問(wèn)器屬性特性
[[Set]] 寫入屬性時(shí)調(diào)用的函數(shù) undefined 訪問(wèn)器屬性特性

2、讀取笛坦、操作特性

名稱 描述 參數(shù) 備注
defineProperty(obj, proname, defineProperty) 修改某個(gè)屬性的特性 1份氧、obj:操作對(duì)象唯袄;
2、proname:需被定義的屬性蜗帜;
3恋拷、defineProperty:特性的修改
/
defineProperties(obj, defineProperty) 修改多個(gè)屬性的特性 1、obj:操作對(duì)象厅缺;
2蔬顾、defineProperty:多個(gè)屬性的特性修改
/
getOwnPropertyDescriptor(obj, defineProperty) 獲取屬性特性的描述 1、obj:操作對(duì)象湘捎;
2诀豁、defineProperty:需獲取特性的屬性
/

使用方法:
defineProperty:

let obj311 = {};
Object.defineProperty(obj311, 'name', {
    value: 'name',       // 屬性的名稱
    configurable: true,  // 是否能通過(guò) delete 操作符 刪除屬性
    writable: true,      // 屬性值是否可以修改
    enumerable: false,   // 是否能通過(guò) for..in 枚舉出屬性,默認(rèn) 實(shí)例 true窥妇,原型鏈 false
})
console.log(obj311);
console.log(Object.getOwnPropertyDescriptor(obj311, 'name'));  // {value: "name", writable: true, enumerable: false, configurable: true}

defineProperties:

let obj321 = {};
Object.defineProperties(obj321, {
    "name": {
        value: 'name',
        configurable: true,
        writable: true,
        enumerable: true,
    },
    "age": {
        value: 20,
        enumerable: true,
        configurable: true,
        writable: true
    }
})
console.log(obj321.name);
console.log(obj321.age);
console.log(Object.getOwnPropertyDescriptor(obj321, 'name')); // {value: "name", writable: true, enumerable: true, configurable: true}
console.log(Object.getOwnPropertyDescriptor(obj321, 'age'));  // {value: 20, writable: true, enumerable: true, configurable: true}

getOwnPropertyDescriptor :

let obj331 = {
    _age: 10,
    type:'小孩'
}; 
Object.defineProperty(obj331, 'age' , {
    get:function(){
        return this._age;
    },
    set:function(newV){
        this._age = newV;
        this.type = newV > 17 ? '成年人' : '小寶寶';
        this.age = newV;  // 訪問(wèn)屬性本身舷胜,會(huì)無(wú)限遞歸導(dǎo)致內(nèi)存泄漏。
    }
})
obj331.age = 2;
console.log(Object.getOwnPropertyDescriptor(obj331, 'type'));  // Object  {value: "小寶寶", writable: true, enumerable: true, configurable: true}
console.log(Object.getOwnPropertyDescriptor(obj331, 'age'))    // Object  {get: ?, set: ?, enumerable: false, configurable: false}

注:
1活翩、訪問(wèn)器屬性 Get烹骨、Set 不能用 this 訪問(wèn)屬性本身,會(huì)導(dǎo)致無(wú)限遞歸材泄,從而引發(fā)內(nèi)存泄漏沮焕。
2、特性修改只能修改一次拉宗,再次修改會(huì)報(bào)錯(cuò)峦树。(Get、Set 作為方法旦事,除外魁巩。)

三、ES5 新增方法:

名稱 描述 參數(shù)
create() 創(chuàng)建對(duì)象 \
keys(obj) 獲取給定對(duì)象的所有可用枚舉的自身的屬性名姐浮,返回一個(gè)數(shù)組 obj:需獲取屬性的對(duì)象
getOwnPropertyNames(obj) 獲取對(duì)象所有屬性谷遂,包括可枚舉和不可枚舉所有屬性 obj:需獲取屬性的對(duì)象

使用方法:
create():

let obj = Object.create();
obj.name = 'myname';

let obj421 = Object.create(Object.prototype, {
    name: {
        value: 'Jack'
    }
})
console.log(obj421.name);  // Jack ,且繼承了 Object 的原型

keys(obj):

function objFn421(){
    this.laskName = 'Black'
}
function objChildFn421(firstName){
    this.firstName = firstName;
}
objChildFn421.prototype = new objFn421();

let sonObj421 = new objChildFn421("Jack");
console.log(Object.keys(sonObj421)); // [Jack]   并沒(méi)有返回從prototype繼承而來(lái)的lastName和不可枚舉的相關(guān)屬性
console.log(sonObj421);

getOwnPropertyNames(obj):

console.log('Object.getOwnPropertyNames =====>') 
function objFn431(){
    this.laskName = 'Black';
}

function childFn431(firstName){
    this.firstName = firstName;
}
childFn431.prototype = new objFn431();

let sonObj431 = new childFn431('Rost');
Object.defineProperty(sonObj431, 'age', {
    enumerable: false
})
console.log(Object.keys(sonObj431));                // ["firstName"]
console.log(Object.getOwnPropertyNames(sonObj431)); // ["firstName", "age"]

四、對(duì)象限制型方法:

名稱 描述 備注
preventExtensions(obj) 防止對(duì)象擴(kuò)展 用來(lái)限制對(duì)象的擴(kuò)展单料,設(shè)置后 將無(wú)法添加新屬性
①、可阻止對(duì)象屬性擴(kuò)展
②点楼、對(duì)象屬性可刪除
④扫尖、無(wú)法添加新屬性 指 無(wú)法在自身添加新屬性,原型鏈上 仍可添加新屬性掠廓。
⑤换怖、可通過(guò) Object.isExtensible(obj):判斷一個(gè)對(duì)象是否可擴(kuò)展,默認(rèn) true
seal(obj) 密封對(duì)象 使對(duì)象無(wú)法添加蟀瞧、刪除已有屬性沉颂,也無(wú)法修改 enumerable条摸、writable、configurable 特性
①可以修改屬性值
②該方法返回被封密 的對(duì)象
③可通過(guò) Object.isSealed(obj):判斷對(duì)象是否被封密
freeze(obj) 凍結(jié)對(duì)象 該方法用來(lái)凍結(jié)一個(gè)對(duì)象铸屉,被凍結(jié)的對(duì)象無(wú)法添加钉蒲、修改、刪除屬性值彻坛,無(wú)法修改屬性的特性值顷啼,即該對(duì)象無(wú)法被修改
①、無(wú)法刪除昌屉、修改自身屬性钙蒙;原型鏈上的屬性可以修改、添加
②间驮、可通過(guò) Object.isFrozen(obj):判斷一個(gè)對(duì)象是否被凍結(jié),默認(rèn) false

使用方法:
1躬厌、Object.preventExtensions(Object):
???(1)使用

function ObjFn511(name){
    this.name = name;
}
let person511 = new ObjFn511('Jack');
Object.preventExtensions(person511);

console.log(person511.name);  // Jack

person511.age = 20;
console.log(person511.age);   // undefined 

delete person511.name;
console.log(person511.name);  // undefined

ObjFn511.prototype.pro_age = 15;
console.log(person511, person511.pro_age);  // 15

???(2)判斷對(duì)象是否可擴(kuò)展 isExtensible()

console.log(Object.isExtensible(person511));  // false

2、Object.seal(obj):
???(1)使用

function PersonFn521(name){
    this.name = name;
}
let person521 = new PersonFn521('Seal');
let person522 = Object.seal(person521);
console.log(person522)  // PersonFn521 {name: "Seal"}

delete person521.name;
console.log(person521.name);  // Seal

???(2)判斷對(duì)象是否被封密 isSealed()

console.log(Object.isSealed(person521)) // true

3竞帽、Object.freeze():
???(1)使用

function PersonFn531(name){
    this.name = name;
}
let person531 = new PersonFn531('Freeze');

Object.freeze(person531);

person531.name = 'newName';
PersonFn531.prototype.age = 20;
console.log(person531.name);    // Freeze
console.log(person531.age);     // 20

???(2)判斷一個(gè)對(duì)象是否被凍結(jié) isFrozen()

console.log(Object.isFrozen(person531)); // true

參考文獻(xiàn):https://blog.csdn.net/weixin_30701575/article/details/96721871扛施、

https://www.cnblogs.com/shiningly/p/9482283.html?utm_source=debugrun&utm_medium=referral

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市抢呆,隨后出現(xiàn)的幾起案子煮嫌,更是在濱河造成了極大的恐慌,老刑警劉巖抱虐,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昌阿,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡恳邀,警方通過(guò)查閱死者的電腦和手機(jī)懦冰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)谣沸,“玉大人刷钢,你說(shuō)我怎么就攤上這事∪楦剑” “怎么了内地?”我有些...
    開(kāi)封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)赋除。 經(jīng)常有香客問(wèn)我阱缓,道長(zhǎng),這世上最難降的妖魔是什么举农? 我笑而不...
    開(kāi)封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任荆针,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘航背。我一直安慰自己喉悴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布玖媚。 她就那樣靜靜地躺著箕肃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪最盅。 梳的紋絲不亂的頭發(fā)上突雪,一...
    開(kāi)封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音涡贱,去河邊找鬼咏删。 笑死,一個(gè)胖子當(dāng)著我的面吹牛问词,可吹牛的內(nèi)容都是我干的督函。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼激挪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼辰狡!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起垄分,我...
    開(kāi)封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤宛篇,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后薄湿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叫倍,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年豺瘤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吆倦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坐求,死狀恐怖蚕泽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情桥嗤,我是刑警寧澤须妻,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站泛领,受9級(jí)特大地震影響荒吏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜师逸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一司倚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧篓像,春花似錦动知、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至奠滑,卻和暖如春丹皱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宋税。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工摊崭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人杰赛。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓呢簸,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親乏屯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子根时,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353