对象的属性、方法

一、对象实例的属性和方法

对象实例常用的属性、方法如下:

名称 描述 参数 返回 属性/方法
constructor (1)保存当前对象的构造函数 ,指向原始的 Object() 函数;
(2)一个类可有多个构造函数,可根据参数个数不同或参数类型不同去区分
/ / 属性
hasOwnProperty(propertyName) 用来判断该属性是否在当前对象实例中,而不是在对象的原型链中 接收一个字符串参数表示属性名 boolean 方法
isPrototypeOf(obj) 判断当前对象 是否在 传入的对象的原型链上 接收一个对象 boolean 方法
propertyIsEnumerable(prototypeName) 判断该属性是否可被 for...in 枚举 接收一个属性 boolean 方法
toString() 返回对象的字符串表示 / String 方法
valueOf() 返回对象的原始值 / / 方法

以下是具体是使用方法:
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 (中国标准时间)'

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 中属性分为两种 - 数据属性、访问器属性;
  • 特性:ES5定义的描述属性的各种特征,是内部值无法直接访问;
  • 区别:
    数据属性 - 拥有 Get、Set 方法,无 [[Writable]]、[[Value]] 两个特性
    访问器属性 - 拥有 [[Writable]]、[[Value]] 两个特性,无 Get、Set 方法


1、属性的特性:用两对中括号表示 ( [[ ]] )
名称 描述 默认值 备注
[[Configurable]] 表示是否可以通过 delete 操作符来删除属性 true /
[[Enumerable]] 表示是否能通过 for...in 语句枚举 实例默认为 true,原型链中默认 false /
[[Writable]] 表示 属性值是否可以修改 true 数据属性特性
[[Value]] 表示 属性的名称 undefined 数据属性特性
[[Get]] 读取属性时调用的函数 undefined 访问器属性特性
[[Set]] 写入属性时调用的函数 undefined 访问器属性特性


2、读取、操作特性

1、特性:

名称 描述 参数 备注
[[Configurable]] 表示是否可以通过 delete 操作符来删除属性 true /
[[Enumerable]] 表示是否能通过 for...in 语句枚举 实例默认为 true,原型链中默认 false /
[[Writable]] 表示 属性值是否可以修改 true 数据属性特性
[[Value]] 表示 属性的名称 undefined 数据属性特性
[[Get]] 读取属性时调用的函数 undefined 访问器属性特性
[[Set]] 写入属性时调用的函数 undefined 访问器属性特性

2、读取、操作特性

名称 描述 参数 备注
defineProperty(obj, proname, defineProperty) 修改某个属性的特性 1、obj:操作对象;
2、proname:需被定义的属性;
3、defineProperty:特性的修改
/
defineProperties(obj, defineProperty) 修改多个属性的特性 1、obj:操作对象;
2、defineProperty:多个属性的特性修改
/
getOwnPropertyDescriptor(obj, defineProperty) 获取属性特性的描述 1、obj:操作对象;
2、defineProperty:需获取特性的属性
/

使用方法:
defineProperty:

let obj311 = {};
Object.defineProperty(obj311, 'name', {
    value: 'name',       // 属性的名称
    configurable: true,  // 是否能通过 delete 操作符 删除属性
    writable: true,      // 属性值是否可以修改
    enumerable: false,   // 是否能通过 for..in 枚举出属性,默认 实例 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;  // 访问属性本身,会无限递归导致内存泄漏。
    }
})
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、访问器属性 Get、Set 不能用 this 访问属性本身,会导致无限递归,从而引发内存泄漏。
2、特性修改只能修改一次,再次修改会报错。(Get、Set 作为方法,除外。)

三、ES5 新增方法:

名称 描述 参数
create() 创建对象 \
keys(obj) 获取给定对象的所有可用枚举的自身的属性名,返回一个数组 obj:需获取属性的对象
getOwnPropertyNames(obj) 获取对象所有属性,包括可枚举和不可枚举所有属性 obj:需获取属性的对象

使用方法:
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]   并没有返回从prototype继承而来的lastName和不可枚举的相关属性
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"]

四、对象限制型方法:

名称 描述 备注
preventExtensions(obj) 防止对象扩展 用来限制对象的扩展,设置后 将无法添加新属性
①、可阻止对象属性扩展
②、对象属性可删除
④、无法添加新属性 指 无法在自身添加新属性,原型链上 仍可添加新属性。
⑤、可通过 Object.isExtensible(obj):判断一个对象是否可扩展,默认 true
seal(obj) 密封对象 使对象无法添加、删除已有属性,也无法修改 enumerable、writable、configurable 特性
①可以修改属性值
②该方法返回被封密 的对象
③可通过 Object.isSealed(obj):判断对象是否被封密
freeze(obj) 冻结对象 该方法用来冻结一个对象,被冻结的对象无法添加、修改、删除属性值,无法修改属性的特性值,即该对象无法被修改
①、无法删除、修改自身属性;原型链上的属性可以修改、添加
②、可通过 Object.isFrozen(obj):判断一个对象是否被冻结,默认 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)判断对象是否可扩展 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)判断对象是否被封密 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)判断一个对象是否被冻结 isFrozen()

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

参考文献:https://blog.csdn.net/weixin_30701575/article/details/96721871

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353