javascript面向对象属性函数用法(defineProperty与getOwnPropertyDescriptor)
defineProperty用于设置一个对象的属性值和描述符,描述符有4个:[[Configurable]], [[Enumerable]], [[Writable]],[[Value]]
当一个属性的描述符设置了[[Writable]],是什么意思呢?
"use strict";
var person = {};
Object.defineProperty( person, "name", {
writable : false,
value : 'ghostwu'
} );
console.log( person.name ); //ghostwu
person.name = "this is ghostwu";
console.log( person.name );//ghostwu
defineProperty为person对象,添加一个name属性,两个属性描述符:
writeble属性: false:不可写 true: 可写
value属性: 'ghostwu'
也就是说,name这个属性的值为ghostwu, 但是不能修改这个值。writable为false的时候,
如果对这个属性name进行重新赋值(修改)在非严格模式下,赋值会被忽略,在严格模式下会报错. 当一个属性的描述符设置了[[Configurable]]?
// "use strict";
var person = {};
Object.defineProperty( person, "name", {
configurable : false,
value : 'ghostwu'
} );
console.log( person.name ); //ghostwu
delete person.name;
console.log( person.name );//ghostwu Object.defineProperty( person, "name", {
configurable : true, //报错
value : 'ghostwu'
} );
defineProperty为person对象,添加一个name属性,
- configurable属性: false:不可配置 true: 可配置
- value属性: 'ghostwu'
也就是说,name这个属性的值为ghostwu, 但是不能删除这个值,
configurable为false的时候,如果删除name属性,在非严格模式下,删除操作会被忽略,在严格模式下会报错
而且如果对一个设置了configurable为false的属性,想把它重新改为true,会报错, 如上例12行
当一个属性的描述符设置了[[Enumerable]]?
// "use strict";
var person = {};
Object.defineProperty(person, "name", {
enumerable: true,
value: 'ghostwu'
});
Object.defineProperty(person, "sex", {
enumerable: false,
value: 'man'
});
Object.defineProperty(person, "age", {
enumerable: true,
value: 22
}); /*
name--->ghostwu
age--->22
*/
for( var i in person ){
console.log( i + '--->' + person[i] );
}
defineProperty为person对象,添加3个属性,name,age,sex. enumerable属性: false:不可枚举 true: 可枚举
也就是说一个属性,如果他的enumerable的值为false,那么这个属性是不能被for...in遍历(循环/枚举)
如上例, sex设置为不可枚举, 所以for..in不会把他枚举出来
Object.getOwnPropertyDescriptor()方法:可以取得给定属性的描述符, 这个方法支持2个参数, 参数1:属性所在的对象. 参数2 : 属性名称。返回值为一个对象
var person = {
name : 'ghostwu',
age : 22,
};
var descriptor = Object.getOwnPropertyDescriptor( person, "name" );
console.log( descriptor.configurable ); //true
console.log( descriptor.enumerable ); //true
console.log( descriptor.writable ); //true
console.log( descriptor.value ); //ghostwu
对于没有使用Object.defineProperty定义的对象. 他们的描述符: configurable,enumerable,writable默认值都为true.
var person2 = {
}
Object.defineProperty( person2, "name", {
value : 'ghostwu'
});
var descriptor2 = Object.getOwnPropertyDescriptor( person2, "name" );
console.log( descriptor2.configurable ); //false
console.log( descriptor2.enumerable ); //false
console.log( descriptor2.writable ); //false
console.log( descriptor2.value ); //ghostwu
对于使用Object.defineProperty定义的对象,如果没有配置描述符的值,那么configurable,enumerable,writable默认值为false
javascript面向对象属性函数用法(defineProperty与getOwnPropertyDescriptor)的更多相关文章
- JavaScript 全局属性/函数
JavaScript 全局 JavaScript 全局属性和方法可用于创建Javascript对象. JavaScript 全局属性 属性 描述 Infinity 代表正的无穷大的数值. NaN 指示 ...
- JavaScript面向对象(01)--函数
在JavaScript中,函数和对象有区别,也有联系, 首先函数是一个对象,但是和对象存在一些区别如下: 1,不论在java还是js中,如果把一个对象赋值给另一个变量,那么,后者会指向前者对象所在的内 ...
- JavaScript全局属性/函数
JavaScript 全局属性和方法可用于创建Javascript对象. JavaScript 全局属性 属性 描述 Infinity 代表正的无穷大的数值. NaN 指示某个值是不是数字值. und ...
- javaScript中with函数用法实例分析
javaScript 中的 with 函数 ,即所谓的with 语句,可以方便地用来引用某个特定对象中已有的属性,但是不能用来给对象添加属性,要给对象创建新的属性,必须明确地引用该对象. with 函 ...
- JavaScript面向对象之函数构造器的理解
1,在使用函数创建类时,函数本身也被称为该类的构造器,该类的构造器方法,该类的构造方法,该类的构造函数等等. 2,注意构造器方法是没有返回值的,当创建该类的实例时,必须调用该类的构造方法. 3,获取构 ...
- JavaScript面向对象+Array的用法及字符串组合+动态建立锚点
脚本部分: function school(sName,sDddress,sPhone,sMail) { this.SName = sName; this.SAddress = sDddress; t ...
- JavaScript replace 回调函数用法
params.query = params.query.replace(/[\+\-\&\|\!\(\)\{\}\[\]\^\"\~\*\?\:\\]/g,function(a){ ...
- JavaScript面向对象轻松入门之综合
javascrpit面向对象之综合 这一章是对前几章的一个总结,通过一个案例来综合认识javascript面向对象的基本用法 需求: 几乎所有的web应用都需要保存数据一些到本地,那么我们就来 ...
- 博文推荐】Javascript中bind、call、apply函数用法
[博文推荐]Javascript中bind.call.apply函数用法 2015-03-02 09:22 菜鸟浮出水 51CTO博客 字号:T | T 最近一直在用 js 写游戏服务器,我也接触 j ...
随机推荐
- python简单实现websocket
协议选择的是新的Hybi-10,参考文章如下: http://www.cnblogs.com/zhuweisky/p/3930780.html http://blog.mycolorway.com/2 ...
- 终于等到你!MobileTest免费公测,华为带你走出安卓适配大坑
一.安卓适配之痛真的无解吗? Android平台的诞生对智能手机的普及功不可没,但设备繁多.品牌众多.版本各异,芯片.摄像头.分辨率不统一等等,这些都逐渐成为Android系统发展的障碍,碎片化严重不 ...
- 【PHP】PHP面向对象编程--phpOOP入门
PHP从入门到精通 之PHP的面相对象编程 面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程架构,OOP的一条基本原则是计算机程序 ...
- springJdbc like模糊查询,Spring namedParameterJdbcTemplate like查询
springJdbc like模糊查询,Spring namedParameterJdbcTemplate like查询, SpringJdbc命名参数like模糊查询,namedParameterJ ...
- 关于abp中使用的sweetalert对话框组件的confirm确认对话框中的一个坑
今天修改了一个功能,限制删除用户,在删除的时候不满足条件的时候提示用户原因,使用的sweet alert组件. abp框架前端集成了sweet alert 对http请求的error做了全局处理,我在 ...
- 【菜鸟入门】安装配置eclipse 并编写运行第一个Java程序
不得不吐槽一下,安装配置这eclipse真是太费劲了...下面总结一下,以便下次再安装 本人 win10系统,64位机 一.在官网下载eclipse安装包 文件名:eclipse-inst-win64 ...
- Jenkins中的一些问题解决(~~不断更新~~)
请使用ctrl+F,查询页面中你需要查找的错误信息(注意空格的输入) 1.错误"error fetching remote repo origin" 本地有多个sshkey,导致构 ...
- LuaFramework热更新过程(及可更新的loading界面实现)
1.名词解释: 资源包:点击 LuaFramework | Build XXX(平台名) Resource,框架会自动将自定义指定的资源打包到StreamingAssets文件夹,这个 ...
- 【canvas学习笔记二】绘制图形
上一篇我们已经讲述了canvas的基本用法,学会了构建canvas环境.现在我们就来学习绘制一些基本图形. 坐标 canvas的坐标原点在左上角,从左到右X轴坐标增加,从上到下Y轴坐标增加.坐标的一个 ...
- JavaScript系统学习小结——变量、作用域和内存问题
趁着写完小论文还未彻底消散的学习氛围,开始着重巩固自己JavaScript的基础知识,为秋招做最基本的准备. 变量:Js的变量可能保存两种不同数据类型的值:基本类型值和引用类型值. 基本类型包括:Un ...