欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

对象属性Object.defineProperty()、hasOwnProperty()、propertyIsEnumerable()

程序员文章站 2022-03-21 19:29:00
Object.defineProperty()对象的属性Object.defineProperty(),深入了解一下这个属性:它的语法:Object.defineProperty(obj, prop, descriptor)参数说明:obj 需要定义属性的对象。prop 需被定义或修改的属性名。descriptor 需被定义或修改的属性的描述符,是一个对象形式。其中描述符有以下属性可选择:configurable: 仅当该属性的 configurable 为 true 时,能够被删除。...

Object.defineProperty()

对象的属性Object.defineProperty(),深入了解一下这个属性:
它的语法

Object.defineProperty(obj, prop, descriptor)

参数说明:
obj 需要定义属性的对象
prop 需被定义或修改的属性名
descriptor 需被定义或修改的属性的描述符,是一个对象形式。
其中描述符有以下属性可选择:

  • configurable: 仅当该属性的 configurable 为 true 时,能够被删除。默认为 false
  • enumerable: 仅当该属性的 enumerable 为 true 时,该属性才能够出现在对象的枚举属性中。默认为 false
  • value: 该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。默认为 undefined
  • writable: 仅当仅当该属性的writable为 true 时,该属性才能被赋值运算符改变。默认为 false
  • get: 一个给属性提供 getter 的方法,如果没有 getter 则为 undefined。该方法返回值被用作属性值。undefined
  • set: 一个给属性提供 setter 的方法,如果没有 setter 则为 undefined。该方法将接受唯一参数,并将该参数的新值分配给该属性。默认为undefined
    下面写程序来了解一下所列举的属性:
var obj = {
	name: "刘德华",
	age: 18
};
Object.defineProperty(obj, "sex", {
	value: "男"
});
obj.sex = "女";
obj.__proto__.job = "写程序";
console.log(obj);

结果如图:
对象属性Object.defineProperty()、hasOwnProperty()、propertyIsEnumerable()

这里我们看到把sex属性成功加到对象中去了,但是这个属性与其它属性相比,相对暗淡一些,这是因为enumerable默认为false,不会被枚举。这里我们试图将sex属性改为’女’也失败了,这是由于writable默认为false

var obj = {
	name: "刘德华",
	age: 18
};
Object.defineProperty(obj, "sex", {
	value: "男",
	enumerable: true,
	writable: true
});
obj.sex = "女";
obj.__proto__.job = "写程序";
console.log(obj);

结果如图:
对象属性Object.defineProperty()、hasOwnProperty()、propertyIsEnumerable()
这里我们看到不仅sex属性变得与其他属性一样的颜色,而且成功把sex属性改为'女'。这就是这两个属性的作用啦!
那个不可删除configurable也是同样的道理,不设true值会让这个属性不可删除了。

下面说说get()set()吧:
属性值可以由一个或两个方法替代,这两个方法就是getter和setter

(a)由getter和setter定义的属性,称为“存取器属性”;

(b) 一般的只有一个值的属性称为“数据属性”;
与存取器属性同名的函数定义没有使用function关键字,而是使用get或set,也没有使用冒号将属性名和函数体分开,但函数体的结束和下一个方法之间有逗号隔开。

(c)查询存取器属性的值,用getter;拥有getter则该属性可读;

(d)设置存取器属性的值,用setter;拥有setter则该属性可写;

var obj = {
	name: "刘德华",
	age: 18
};
Object.defineProperty(obj, "sex", {
	get:()=> {
       if (this.sex) {
           return this.sex;
	       } else {
	           return 1;
	       }
   		},
   set:(value)=>{
       this.sex = value;
   },
});
obj.sex = "女";
obj.__proto__.job = "写程序";
console.log(obj.sex); //女

结果如图:
对象属性Object.defineProperty()、hasOwnProperty()、propertyIsEnumerable()

这个程序就是设值得值的过程。

hasOwnProperty()

hasOwnProperty()检查一个属性是否属于某个对象自有属性,不包括继承来的属性

var person = {
    name:'yourname', 
    age:10
};
person.__proto__.LastName = "deng"; //让person继承一个LastName属性
Object.defineProperty(person, "sex", {
	value: "male",
	enumerable: false			//不可枚举
});
console.log(person.hasOwnProperty('name'));     //true
console.log(person.hasOwnProperty('sex'));      //true
console.log(person.hasOwnProperty('toString')); //false
console.log(person.hasOwnProperty('LastName')); //false

propertyIsEnumerable()

propertyIsEnumerable():是hasOwnProperty()的增强版,检查一个属性是否属于某个对象自有属性,不包括继承来的属性,且该属性可枚举
此时继上面程序用上该语句会得到:

console.log(person.propertyIsEnumerable('sex'));      //false

本文地址:https://blog.csdn.net/qq_48784569/article/details/107492928