资讯专栏INFORMATION COLUMN

js中对象属性的整理

lavor / 327人阅读

摘要:不管函数还是数据,都可以称为某某对象的属性。一些细节输出结果如下可以看出,函数是有的数据属性是创建对象时定义的,所有属性特性都是是用定义的,默认为数据属性,所有属性特性默认为。访问器属性暂时想到的,就是通过改变该属性改变内部多个属性。

都知道js是面向对象的,创建了对象后,对象中保存的就是一组组名值对,值可以是数据类型或函数。不管函数还是数据,都可以称为某某对象的属性。再细分,属性可以有两个类型:数据属性或访问器属性。
因此,数据属性不要误解为是数据的属性类型,函数的属性类型也是数据属性的。

var obj = {say:function(){return this.name;},age:11};
console.log(Object.getOwnPropertyDescriptors(obj));
//输出{value: ƒ, writable: true, enumerable: true, configurable: true}

数据属性(4个):
value: 大家熟知的一样,保存的是数据值,如果是函数,保留的就是整个函数。
writable: 是否可修改,设置为false可以巧妙定义出"私有变量"。true表示可修改,false则相反。
enumerable: 该属性是否可被枚举出。true表示可枚举,false则相反。
configurable: delete属性有没有用,能否修改value和enumerable属性,能否把属性改为访问器属性。true就是都可以,false就是都不可以。
访问器属性(4个):
configurable:同上
enumerable: 同上
get:一个用于访问其他属性值的函数
set:一个用于修改其他属性值的函数

对于这些属性类型,可以修改,用defineProperty()或defineProperties();可以读取,用getOwnPropertyDescriptor()或getOwnPropertyDescriptors()。当然,访问器属性只能用defineProperty()或defineProperties()创建。
一些细节:

var obj = {say:function(){return this.name;},age:11};
Object.defineProperty(obj,"name",{});
console.log(Object.getOwnPropertyDescriptors(obj));
//输出结果如下:
//age:{value: 11, writable: true, enumerable: true, configurable: true}
//name:{value: undefined, writable: false, enumerable: false, configurable: false}
//say:{value: ƒ, writable: true, enumerable: true, configurable: true}

可以看出,函数say是有value的数据属性;age是创建对象时定义的,所有属性特性都是true;name是用defineProperty()定义的,默认为数据属性,所有属性特性默认为false。

var obj = {age:11};
Object.defineProperty(obj,"age",{
    configurable:false
});
Object.defineProperty(obj,"age",{
    writable:false,
    // enumerable:false,   会报错
    // configurable:true,  会报错
    value:12
});
Object.defineProperty(obj,"name",{
    configurable:false,     //如果不指定,默认也都是false
    value:2
});
Object.defineProperty(obj,"name",{
    // writable:false,     会报错
    // enumerable:false,   会报错
    // configurable:true,  会报错
    // value:12            会报错
});

创建时定义的属性:修改了configurable后,其实还是可以修改writable和value属性的。
defineProperty()定义的属性:configurable一旦是false,以后就不可能在更改任何属性。

访问器属性暂时想到的,就是通过改变该属性改变内部多个属性。而且,如果某属性writable是false,访问器属性改变该属性会无效。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/93131.html

相关文章

  • 前端面试知识点目录整理

    摘要:写在前面金三银四又到了一年一度的跳槽季相信大家都在准备自己面试笔记我也针对自己工作中所掌握或了解的一些东西做了一个目录总结方便自己复习详细内容会在之后一一对应地补充上去有些在我的个人主页笔记中也有相关记录这里暂且放一个我的面试知识点目录大家 写在前面: 金三银四, 又到了一年一度的跳槽季, 相信大家都在准备自己面试笔记, 我也针对自己工作中所掌握或了解的一些东西做了一个目录总结,方便自...

    xzavier 评论0 收藏0
  • 前端面试知识点目录整理

    摘要:写在前面金三银四又到了一年一度的跳槽季相信大家都在准备自己面试笔记我也针对自己工作中所掌握或了解的一些东西做了一个目录总结方便自己复习详细内容会在之后一一对应地补充上去有些在我的个人主页笔记中也有相关记录这里暂且放一个我的面试知识点目录大家 写在前面: 金三银四, 又到了一年一度的跳槽季, 相信大家都在准备自己面试笔记, 我也针对自己工作中所掌握或了解的一些东西做了一个目录总结,方便自...

    enda 评论0 收藏0
  • 前端面试之路二(javaScript基础整理)

    摘要:在标签中添加属性,本质上是跟在标签里面写属性时一样的,所以属性值最终都会编译为字符串类型。这个节点包括很多,比如,以及一些方法等方法。一个对象有很多,该集合名字为,里面有其他以及,里面有很多。 一、变量类型和计算 JS中使用typeof能得到哪些类型 变量类型 值类型:变量本身就是含有赋予给它的数值的,它的变量本身及保存的数据都存储在栈的内存块当中 引用类型:引用类型当然是分配到...

    AbnerMing 评论0 收藏0
  • js 部分学习整理

    摘要:每一个函数都有一个属性,而这个属性也是一个对象,就叫做原型对象,对象里有一个属性指向了函数。所以给原型添加一个属性,对象也会有这个属性。 js要掌握的东西。原型 闭包声明提升基本数据类型高阶函数JSONJSONP 跨域 iframe 通信Ajax原生DOM操作(比如 逆序DOM节点)事件捕捉,捕获,冒泡,代理Array常用函数String常用函数ES5 + ES6VUE框架部分(大部分...

    SimpleTriangle 评论0 收藏0
  • js 零碎知识整理

    摘要:,看了这样的解释,或许让你更摸不着头脑了。弹出弹出在这个例子中,只要会使用浏览器的朋友,都能看得出来完全继承了的属性和方法,否则是无法解释的,因为在中并没有定义属性和,那么按常理推断在的实例对象中,并不会出现这两个属性。 快速删除尾部数组 var arr=[1,2,3,4,5]; arr.length=3; console.log(arr)//[1,2,3] 直接改变数组的length...

    liaorio 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<