一阀湿、對(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