javascript --- 属性描述符

从ES5开始,所有的属性都具备了属性描述符

var myObject = {a: 2
};Object.getOwnPropertyDescriptor(myObject, "a");
//{
//    value:2,
//    writable: true,    // 可写
//    enumerable: true,    // 可枚举
//    configurble: true    // 可配置
//}

定义属性:(Object.defineProperty):

// Object.defineProperty
var myObject = {};Object.defineProperty(myObject, "a", {value: 2,writable: true,configurable: true,enunmerable: true
});myObject.a;    // 2// 给myObject定义一个a属性,值为2,可写、可枚举、可配置

可写性(writable):

// writable
Object.defineProperty(myObject, "a", {value: 2,writable: false, // 不可写configurable: true,enumerable: true
})
myObject.a = 3;
myObject.a;   // 2

可配置(configurable):

// configurable
Object.defineProperty(myObject, "a", {value: 4,writable: true,configurable: false,    // 不可配置enumerable: true
}); 
Object.defineProperty(myObject, "a", {value: 6,writable: true,configurable: true,enumerable: true
});   // TypeError .. 对于confugirable为false的属性,不允许将其改为truedelete myObject                                                                                                                                                                                                                                                                                                                                                                .a ; // 删除无效 
myObject.a; // 2 

对象常量:

// 结合writable和configurable创建一个真正的常量属性
var myObejct = {};
Object.defineProperty(myObject, "FAVORITE_NUMBER", {value: 42,writable: false,configurable: false
});

禁止扩展:

// 禁止一个对象添加新属性 Object.preventExtensions()
var myObject={a: 2
};
Object.preventExtensions(myObject);myObject.b = 3;
myObject.b; // undefined

Getter:

// getter是一个隐藏函数,会在获取属性值时调用
var myObject = {// 给a定义一个getterget a() {return 2;   // 在使用myObject.a时调用,返回2}
};
Object.defineProperty(myObject,"b",{// 给b设置一个getterget function () {return this.a * 2},    // 在使用myObject.b时回返回一个 2*a// 确保B会出现在对象的属性列表中enumerable: true}
};
myObject.a;  // 2
myObject.b;  // 4

Setter:

// 在调用对属性的赋值时,触发
// 一般与getter成对出现
var myObject = {// 给a定义一个getterget a() {return this._a_;},// 给a定义一个setterset a(val) {this._a_ = val * 2;}
};
myObject.a = 2;   // 赋值操作,触发setter
myObject.a;  // 4  // 读取操作,触发getter

检查对象中的属性:

// a in object
// hasOwnProperty
var myObject = {a: 2
};
("a" in myObject);  // true
("b" in myObject);  // falsemyObject.hasOwnproperty("a");   // true
myObject.hasOwnproperty("b");   // false// 注: in操作符会检查属性是否在对象及其 [[Prototype]]原型链中,hasOwnproperty()只会检查属性是否在myObject对象中(不会检查[[Prototype]]链).

遍历:

// forEach()会遍历数组中的所有值并忽略回调函数的返回值.
// every()会一直运行直到回调函数返回false
// some()会一直运行直到回调函数返回true
// for...in遍历对象是无法直接获取属性值的,因为它实际上遍历的是对象中的所有可枚举属性,你需要手动获取属性值.// ES6新增for...of循环语法,来直接遍历值:
var myArray = [1, 2, 3];
for(var v of myArray) {console.log(v);
}// 可以使用数组内置的@@iterator来看看它是如何工作的:
var myArray = [1, 2, 3];
var it = myArray[Symbol.iterator]();
console.log(it.next());   // {value: 1,done: false }
console.log(it.next());   // {value: 2,done: false }
console.log(it.next());   // {value: 3,done: false }
console.log(it.next());   // {done: true}

自定义迭代器:

// 给任何你想遍历的对象定义@@iterator,
var myObject = {a: 2,b: 3
};
Object.defineProperty( myObject, Symbol.iterator,{enumerable: false,  // 不可枚举writable: false,  // 不可写configurable: true, // 可配置value: function() {var o = this;  // this指代myObject.[{a:2},{b:3}]var idx = 0;var ks = Object.keys(o); // 获取元素值[2,3]return {next: function() {   // 返回一个next()方法. 使用obj.next()调用. 返回值和是否完成.return {value: o[ks[idx++]],done: (idx > ks.length)};}};}
});
// 手动遍历myObject
var it = myObject[Symbol.iterator]();
it.nexr();   // {value: 2, done: false}
it.next();   // {value: 3, done: false}
it.next();   // {value: undefined, done: true}// 用for...of遍历myObject
for(var v of myObject) {console.log(v);
}

参考《你不知道的JavaScript》(上卷)P111~P124

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251240.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

看了吗网址链接

sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId1005269003&utm_campaigncommission&utm_sourcecp-400000000398149&utm_mediumshare # -*- coding: utf-8 -*- ""&qu…

JMeter 性能测试进阶实战

课程简介 本课程制作的主要目的是为了让大家快速上手 JMeter,期间穿插了大量主流项目中用到的技术,以及结合当今主流微服务技术提供了测试 Dubbo 接口、Java 工程技术具体实施方案,注重实践、注意引导测试思维、拒绝枯燥的知识点罗列、善于用…

javascript --- 混入

显示混入: function mixin(sourceObj, targetObj){for(var key in sourceObj){ // 遍历source中的所有属性if(!(key in targetObj)) { // 找到targetz中没有的属性targetObj[key] sourceObj[key];}}return targetObj; }var Vehicle {engines: 1,iginition: function() {c…

php源码代目录

ext :存放动态和内建模块的目录,在这里可以找到所有的php官方亏站,并且也可以在这里编写扩展; main:包含php的主要宏定义; pear: PHP扩展与应用库; sapi:包含不同服务器抽象层的代码; TSRM:Zend和PHP的"线程安全资源管理器"目录; Z…

bzoj1231 [Usaco2008 Nov]mixup2 混乱的奶牛——状压DP

题目&#xff1a;https://www.lydsy.com/JudgeOnline/problem.php?id1231 小型状压DP&#xff1b; f[i][j] 表示状态为 j &#xff0c;最后一个奶牛是 i 的方案数&#xff1b; 所以下一个只能是和它相差大于 k 而且不在状态中的奶牛。 代码如下&#xff1a; #include<iostr…

JavaScript高级程序设计阅读笔记

2020-11-15 通过初始化指定变量类型 数字-1 对象null和null的比较&#xff08;不理解&#xff09;使用局部变量将属性查找替换为值查找&#xff08;算法复杂度&#xff09;循环的减值迭代&#xff0c;降低了计算终止条件的复杂度switch快多个变量声明逗号隔开使用数组和对象字面…

jquery --- 监听input框失效

使用juery监听Input输入的变化,并且封装起来,如下: // html <input type"text" id‘myinput1’ /> // js function formOnById(id){let dom # id;$(dom).bind(input propertychange,()>{let item $(dom).val;console.log(item);} } formOnById(myinp…

windows任务计划程序 坑

转载于:https://www.cnblogs.com/kaibindirver/p/8109041.html

第三篇:函数之嵌套

1 #函数的嵌套调用&#xff1a;在调用一个函数的时&#xff0c;其内部的代码又调用其他的函数2 # def bar():3 # print(from bar)4 #5 # def foo():6 # print(from foo)7 # bar()8 #9 # foo() 10 11 12 # def max2(x,y): 13 # if x > y: 14 # ret…

vue路由权限(结合服务端koa2)

gitee地址 一、项目初始化 vue create manager-admin // 创建vue项目// 管理员权限安装 cnpm i -S koa2 // 下载koa2依赖 cnpm install --global koa-generator // 下载框架 koa-generator koa2 manager-server // 创建项目 cd manager-server // 进入项目 npm install // 安…

javascript --- 类、class、事件委托的编程风格

类风格: // 父类 function Widget(width, height) {this.width width || 50;this.height height || 50;this.$elem null; } Widget.prototype.render function($where) {if(this.$elem) {this.$elem.css({width: this.width "px",height: this.height "p…

在线获取UUID

http://fir.im/udid转载于:https://www.cnblogs.com/mtjbz/p/8116576.html

堆和堆排序

堆和优先队列 普通队列&#xff1a;FIFO&#xff0c;LILO 优先队列&#xff1a;出队顺序和入队顺序无关&#xff0c;和优先级相关。一个典型应用就是操作系统中。动态选择优先级高的任务执行 堆的实现 最典型的堆就是二叉堆&#xff0c;就像是一颗二叉树。这个堆的特点&#xf…

ES5-1 发展史、ECMA、编程语言、变量、JS值

1. 5大主流浏览器及内核&#xff08;自主研发&#xff09; 浏览器内核IEtridentChromewebkit blinkSafariwebkitFirefoxgeckoOperapresto 2. 浏览器的历史 和 JS诞生 1989-1991 WorldWideWeb&#xff08;后来为了避免与万维网混淆而改名为Nexus&#xff09;是世界上第一个网页…

javascript --- 使用对象关联简化整体设计

在某个场景中,我们有两个控制器对象: 1.用来操作网页中的登录表单; 2.用来与服务器进行通信. 类设计模式 // 把基础的函数定义在名为Controller的类中,然后派生两个子类LoginController和AuthController. // 父类 function Controller() {this.errors []; } Controller.prot…

javascript --- polyfill中几个常用方法

ES6中,新增了许多有用的方法,下面分享几个ES6之前得版本写的polyfill Number.EPSILON: // 机器精度,并判断2个数是否相等 if(!Number.EPSILON){Number.EPSILON math.pow(2, -52); }function numberCloseEnoughToEqual(n1, n2) {return Math.abs(n1 - n2 ) < Number.EPSIL…

[Usaco2010 Nov]Visiting Cows

题目描述 经过了几周的辛苦工作,贝茜终于迎来了一个假期.作为奶牛群中最会社交的牛,她希望去拜访N(1<N<50000)个朋友.这些朋友被标号为1..N.这些奶牛有一个不同寻常的交通系统,里面有N-1条路,每条路连接了一对编号为C1和C2的奶牛(1 < C1 < N; 1 < C2 < N; C1…

ES5-2 语法、规范、错误、运算符、判断分支、注释

1. 错误 MDN错误列表 Uncaught SyntaxError: Unexpected token ) // 语法错误 Uncaught ReferenceError: a is not defined // 引用错误等类型 Uncaught TypeError: Cannot read property toString of null出现一个语法错误&#xff0c;则一行代码都不会执行&#xff08;检查…

新单词 part 4

part 41.veto 英[ˈvi:təʊ]美[ˈvi:toʊ]n. 行使否决权; 否决权&#xff0c;否认权; 否决理由;vt. 否决&#xff0c;不同意; 不批准&#xff0c;禁止;vi. 否决; 禁止;2.acoustics 英[əˈku:stɪks]美[əˈkustɪks]n. 声学; &#xff08;传声系统的&#xff09; 音响效果; 声…

unity深度查找某个子物体和遍历所有子物体方法

本文总结一下关于unity的查找子物体的方法 首先说明一下这里将讲三种查找子物体方法&#xff1a; 查找固定路径的某一个子物体的方法、通过名字深度查找某个子物体的方法、查找父物体下所有子物体的方法。 第一:查找固定路径的某一个子物体的方法 对于已知的路径可以直接用go.t…