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 ...
随机推荐
- 002.Create a web API with ASP.NET Core MVC and Visual Studio for Windows -- 【在windows上用vs与asp.net core mvc 创建一个 web api 程序】
Create a web API with ASP.NET Core MVC and Visual Studio for Windows 在windows上用vs与asp.net core mvc 创 ...
- Socket 文件传输
服务端 1.控件:TServerSocket 2.OnClientRead事件处理 procedure TMainForm.ssClientRead(Sender: TObject; Socket: ...
- CSS命名实践
前面的话 每次写HTML结构涉及到CSS命名时,都要挣扎一番.关于CSS命名的规范,市面上有不少,如OOCSS.SMACSS.BEM和MVCSS等.在这里面最火的应该算BEM了.本文将详细介绍CSS命 ...
- Carbondata源码系列(一)文件生成过程
在滴滴的两年一直在加班,人也变懒了,就很少再写博客了,最近在进行Carbondata和hive集成方面的工作,于是乎需要对Carbondata进行深入的研究. 于是新开一个系列,记录自己学习Carbo ...
- jmeter-命令行执行脚本
日常测试过程中发现,在大数量并发时,jmeterGUI界面时长宕机.卡死,在这种情况下我们就需要使用命令行来执行脚本了(非GUI), 命令行执行首先就必须要配置环境变量,如同JAVA-HOME一样,这 ...
- pug模板引擎(原jade)
前面的话 为什么要引入pug,pug有什么特别之处呢?有一些嵌套层次较深的页面,可能会出现巢状嵌套,如下图所示 在后期维护和修改时,一不小心少了一个尖括号,或者某个标签的开始和闭合没有对应上,就会导致 ...
- java中常用的包、类、以及包中常用的类、方法、属性----sql和text\swing
java中常用的包.类.以及包中常用的类.方法.属性 常用的包 java.io.*; java.util.*; java.lang.*; java.sql.*; java.text.*; java.a ...
- eclipse maven构建
run as --> maven install 1.No compiler is provided in this environment. Perhaps you are running o ...
- tensorflow Relu激活函数
1.Relu激活函数 Relu激活函数(The Rectified Linear Unit)表达式为:f(x)=max(0,x). 2.tensorflow实现 #!/usr/bin/env pyth ...
- tensorflow Sigmoid 应用
1.函数 函数:f(z) = 1 / (1 + exp( − z)) 导数:f(z)' = f(z)(1 − f(z)) 2.tensorflow实现 #!/usr/bin/env python # ...