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)的更多相关文章

  1. JavaScript 全局属性/函数

    JavaScript 全局 JavaScript 全局属性和方法可用于创建Javascript对象. JavaScript 全局属性 属性 描述 Infinity 代表正的无穷大的数值. NaN 指示 ...

  2. JavaScript面向对象(01)--函数

    在JavaScript中,函数和对象有区别,也有联系, 首先函数是一个对象,但是和对象存在一些区别如下: 1,不论在java还是js中,如果把一个对象赋值给另一个变量,那么,后者会指向前者对象所在的内 ...

  3. JavaScript全局属性/函数

    JavaScript 全局属性和方法可用于创建Javascript对象. JavaScript 全局属性 属性 描述 Infinity 代表正的无穷大的数值. NaN 指示某个值是不是数字值. und ...

  4. javaScript中with函数用法实例分析

    javaScript 中的 with 函数 ,即所谓的with 语句,可以方便地用来引用某个特定对象中已有的属性,但是不能用来给对象添加属性,要给对象创建新的属性,必须明确地引用该对象. with 函 ...

  5. JavaScript面向对象之函数构造器的理解

    1,在使用函数创建类时,函数本身也被称为该类的构造器,该类的构造器方法,该类的构造方法,该类的构造函数等等. 2,注意构造器方法是没有返回值的,当创建该类的实例时,必须调用该类的构造方法. 3,获取构 ...

  6. JavaScript面向对象+Array的用法及字符串组合+动态建立锚点

    脚本部分: function school(sName,sDddress,sPhone,sMail) { this.SName = sName; this.SAddress = sDddress; t ...

  7. JavaScript replace 回调函数用法

    params.query = params.query.replace(/[\+\-\&\|\!\(\)\{\}\[\]\^\"\~\*\?\:\\]/g,function(a){ ...

  8. JavaScript面向对象轻松入门之综合

    javascrpit面向对象之综合   这一章是对前几章的一个总结,通过一个案例来综合认识javascript面向对象的基本用法   需求: 几乎所有的web应用都需要保存数据一些到本地,那么我们就来 ...

  9. 博文推荐】Javascript中bind、call、apply函数用法

    [博文推荐]Javascript中bind.call.apply函数用法 2015-03-02 09:22 菜鸟浮出水 51CTO博客 字号:T | T 最近一直在用 js 写游戏服务器,我也接触 j ...

随机推荐

  1. 基于angular4.0分页组件

    分页组件一般只某个页面的一小部分,所以我们它是子组件 当然如果你承认这话的,可以往下看,因为我把他当作子组建来写了 分页组件的模版 import { Component } from '@angula ...

  2. 图论基础之Dijkstra算法的初探

         图论,顾名思义就是有图有论.        图:由点"Vertex"和边"Edge "组成,且图分为有向图和无向图(本文讨论有向图),之前做毕业设计的 ...

  3. webpack初步介绍

    我们通过npm -g可以安装一个webpack的东西. npm -g叫做全局安装,通常是安装CLI程序(commond line interface). 我们只用过一次,装了cnpm.此时就能在CMD ...

  4. mysql中exists、not exists的用法

    exists 关键字是判断是否存在的,存在则返回true,不存在则返回false, not exists则是不存在时返回true,存在返回false: 1. 最常用的if not  exists用法: ...

  5. HTML5中a标签的锚点使用

    前几天有个用户问我关于在线手册功能里的锚点问题.因为他通过代码发现,在编辑手册内容时,锚点的设置是通过id选择器来制定的,而不是带有name属性的a标签.其实这是HTML5和HTML4(XHTML)等 ...

  6. Linux常用命令及shell技巧

    这里列出一些个人在工作中常使用的各种linux命令,每一个不详细讲参数,只写经常用的参数.希望快速获得在linux命令行工作的能力的朋友可以看看.本人一直觉的,不使用linux 图形界面,以xshel ...

  7. 51nod_1639:绑鞋带

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1639 #include <bits/stdc++.h& ...

  8. win10 设置默认输入法为英文,ctrl +shift切换中文

    控制面板-更改输入法,这个界面出现的是电脑现在安装的语言,每个语言中可能有多个输入法,比如我的有微软的和qq的,谁在上谁就是系统的默认语言(本人当然是中文在上),英文中有美式键盘. 如果想要电脑启动的 ...

  9. 对于mariadb安装后可以默认使用无密码登录的问题解决方案

    mariadb安装后默认可以无密码登录 所以首先我们要设置root用户的密码 mysqladmin -u root -p password 密码 [遇到enter直接enter就行,注意,如果是重新设 ...

  10. Python开发【笔记】:单线程下执行多个定时任务

    单线程多定时任务 前言:公司业务需求,实例当中大量需要启动定时器的操作:大家都知道python中的定时器用的是threading.Timer,每当启动一个定时器时,程序内部起了一个线程,定时器触发执行 ...