万象更新 Html5 - es6 类: object

news/2024/9/24 11:31:19

源码 https://github.com/webabcd/Html5
作者 webabcd

万象更新 Html5 - es6 类: object

示例如下:

es6\src\class\object.js

// 定义对象时省略属性名
const name = "webabcd";
const age = 40;
const a = {name, age}; // 定义对象时省略属性名(其属性名默认为变量名称)
const b = {name: name, age: age}; // 这是 es5 写法,等价于上面的
console.log(`${JSON.stringify(a)}, ${JSON.stringify(b)}`);
// {"name":"webabcd","age":40}, {"name":"webabcd","age":40}// 定义对象的方法时,可以省略 function 关键字或者使用 lambda 表达式
const c = {helloOld:function() { // 这是 es5 写法,等价于下面的return "hello";},helloNew() { // 定义对象的方法时,可以省略 function 关键字return "hello";},helloLambda: () => { // 定义对象的方法时,可以使用 lambda 表达式return "hello";}
}
console.log(`${c.helloOld()}, ${c.helloNew()}, ${c.helloLambda()}`);
// hello, hello, hello// 对象的 getter 和 setter
const d = {_name: "webabcd",get name() { // getter 和 setter 的写法return this._name;},set name(val) {this._name = val;},
}
d.name = "wanglei";
console.log(d.name);
// wanglei// 使用表达式来定义属性名或方法名
let stringHello = "hello";
const e = {[stringHello + "2"]() { // 使用表达式定义方法名return "hello";}
}
const f = { // 使用表达式定义属性名[stringHello + "2"]: "hello"
};
console.log(`${e.hello2()}, ${f.hello2}`);
// hello, hello// 合并对象(重名的后面会覆盖前面)
let o1 = {k1: "aaa", k2: "bbb"};
let o2 = {k2: "ddd", k4: "eee"};
let g = {...o1, k3: "ccc", ...o2};
console.log(`${JSON.stringify(g)}`);
// {"k1":"aaa","k2":"ddd","k3":"ccc","k4":"eee"}// 通过 Object.assign(target, source_1, source_2, ...) 合并对象(重名的后面会覆盖前面)
// 为指定的类添加指定的方法,请参看 /es6/class/main.js 中的 Object.assign 部分
let h = {k1: "aaa", k2: "bbb"};
let o3 = {k3: "ccc"};
let o4 = {k2: "ddd", k4: "eee"};
Object.assign(h, o3, o4);
console.log(`${JSON.stringify(h)}`);
// {"k1":"aaa","k2":"ddd","k3":"ccc","k4":"eee"}// “==” 会自动转换数据类型,而 “===” 则不会
// Object.is(value1, value2) 与 “===” 基本类似,只有 -0 和 +0 之间的比较,以及 NaN 的比较有所不同
console.log(`${1 == "1"}, ${1 === "1"}, ${Object.is({}, {})}, ${-0 === +0}, ${Object.is(-0, +0)}, ${NaN === NaN}, ${Object.is(NaN, NaN)}`);
// true, false, false, true, false, false, true// 定义对象,设置或获取 key/value
// "xxx" in obj - 判断 obj 里是否有名为 xxx 的 key
let o5 = {k1: "aaa", k2: "bbb"}; // 可写,可枚举
o5.k3 = "ccc"; // 可写,可枚举
o5["k4"] = "ddd"; // 可写,可枚举
// Object.defineProperty()/Object.defineProperties() - 扩展对象的属性
// "xxx" in obj - 判断 obj 里是否有名为 xxx 的属性
Object.defineProperty(o5, "p1", {value: "v1",writable: true, // 可写(默认值为 false)enumerable: true // 可枚举(默认值为 false)
});
Object.defineProperties(o5, {'p2': {value: "v2",writable: true},'p3': {value: "v3",writable: true}
});
// Object.keys() - 遍历指定对象的 key(只能遍历可枚举的)
let keys = Object.keys(o5);
// Object.values() - 遍历指定对象的 value(只能遍历可枚举的)
let values = Object.values(o5);
// Object.entries() - 遍历指定对象的 key/value(只能遍历可枚举的)
let entries = Object.entries(o5);
// Object.getOwnPropertyNames() - 遍历对象的属性名(无论是否可枚举,均可遍历)
let names = Object.getOwnPropertyNames(o5);
console.log(keys); // ["k1", "k2", "k3", "k4", "p1"]
console.log(values); // ["aaa", "bbb", "ccc", "ddd", "v1"]
console.log(entries); // [["k1", "aaa"], ["k2", "bbb"], ["k3", "ccc"], ["k4", "ddd"], ["p1", "v1"]]
console.log(names); // ["k1", "k2", "k3", "k4", "p1", "p2", "p3"]
console.log(o5.k1, o5["p3"], "k1" in o5, "p9" in o5); // aaa v3 true false// 说说 call(), apply(), bind() - 均用于调用的时候修改 this 的指向
let o6 = {name: "webabcd",age: 40,hello(p1, p2) {console.log(`name:${this.name}, age:${this.age}, p1:${p1}, p2:${p2}`);}
};
o6.name = "wanglei";
// hello() 中的 this 指向的是 o6
o6.hello("a", "b"); // name:wanglei, age:40, p1:a, p2:b
let o7 = {name: "wanglei",age: 20,
};
// call(thisObj,arg1,arg2,arg3,……) - hello() 中的 this 指向的是 call() 的第 1 个参数
o6.hello.call(o7, "x", "y"); // name:wanglei, age:20, p1:x, p2:y
// apply(thisObj,argArr) - hello() 中的 this 指向的是 apply() 的第 1 个参数
o6.hello.apply(o7, ["x", "y"]); // name:wanglei, age:20, p1:x, p2:y
// bind(thisObj,arg1,arg2,arg3,……) - hello() 中的 this 指向的是 bind() 的第 1 个参数(bind() 返回的是一个函数,要拿到结果需要再“()”一下,其他与 call() 一样)
o6.hello.bind(o7, "x", "y")(); // name:wanglei, age:20, p1:x, p2:y// preventExtensions() - 禁止指定对象添加新属性
// Object.preventExtensions(o8);// isExtensible() - 是否可为指定对象添加新属性,默认为 true,如果调用了 preventExtensions() 则此值为 false
// Object.isExtensible(o8);// Object.seal() - 先调用 preventExtensions(),再将对象的所有属性标记为 configurable:false
// Object.seal(o8);// Object.freeze() - 先调用 seal(),再将对象的所有属性标记为 writable:false
// Object.freeze(o8);// 注:能用 Reflect 的方法就用 Reflect 的,而不要再用 Object 的了// delete - 删除对象的属性
let o9 = {name: "webabcd"
}
console.log(o9.name); // webabcd
delete o9.name;
console.log(o9.name); // undefined// 对象的解构赋值(destructuring)
// 将值赋给同属性名指向的变量
let {a: x1, b: x2} = {a: "aaa", b: "bbb"};
console.log(x1, x2); // aaa bbb
// 下面这句是简写,写全了就是 let {x3: x3, x4: x4} = {x3: "aaa", x4: "bbb"};
let {x3, x4} = {x3: "aaa", x4: "bbb"};
console.log(x3, x4); // aaa bbb
// 带默认值的
let {a: x5 = 1, b: x6 = 2} = {a: 3};
console.log(x5, x6); // 3 2
// 下面这句是简写,写全了就是 let {x7: x7 = 1, x8: x8 = 2} = {x7: 3};
let {x7 = 1, x8 = 2} = {x7: 3};
console.log(x7, x8); // 3 2
// 未被解构的都放入 ... 标记的变量
let {y1, y2, ...yyy} = {y5: 5, y1: 1, y2: 2, y3: 3, y4: 4};
console.log(y1, y2, yyy); // 1 2 {y5: 5, y3: 3, y4: 4}

源码 https://github.com/webabcd/Html5
作者 webabcd

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

app手机元素定位方式

方式一:采用uiautomatorviewer元素定位 ①这个定位方式有缺陷也就是它只能识别Android8以下的系统,8及以上的系统就无法定位了 ②位置:这个工具是位于安装的SDK下的tools文件下,我的安装路径如下③双击打开这个工具就行,再运行的页面点击 方式二:安装Appium-Inspector ①下…

从0到0.1学习实践盒子模型

从0到0.1学习实践盒子模型 盒子模型概念 预备知识margin:外边距【两个元素之间的距离】 border:边框 padding:内边距【内容区域和边框距离】 height:文本高度 width:文本宽度content-box (形象图片)content-box--只计算内容区域的宽度和高度,边框和内边距不算在内。 .b…

Leetcode 445. 两数相加 II

1.题目基本信息 1.1.题目描述 给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。 你可以假设除了数字 0 之外,这两个数字都不会以零开头。 1.2.题目地址 https://leetcode.cn/problems/add…

Windows命令:时间延迟命令

延迟一段时间再执行下一条命令”。 一、利用ping实现延迟命令 这种延时手段是不精确的,因为每一次ping通的延迟不一样。 1、示例chcp 65001 @echo off echo 延时前:%time% ping /n 3 127.0.0.1 >nul echo 延时后:%time% pause 参数/n表示ping通的次数。127.0.0.1是本机ip…

电力施工作业绝缘手套识别系统

电力施工作业绝缘手套识别系统对电力作业人员在电力设备上进行施工作业时是否佩戴绝缘手套进行识别分析,当电力施工作业绝缘手套识别系统检测到作业人员未佩戴绝缘手套时立即抓拍存档同步回传给后台监控人员,提醒相关人员及时制止,及时规避更危险的触电事故发生。电力施工作…

sicp每日一题[2.24-2.27]

2.24-2.26没什么代码量,所以跟 2.27 一起发吧。Exercise 2.24Suppose we evaluate the expression (list 1 (list 2 (list 3 4))). Give the result printed by the interpreter, the corresponding box-and-pointer structure, and the interpretation of this as a tree (as…

ansible-cmdb简单使用

1、安装 官方:https://ansible-cmdb.readthedocs.io/en/latest/ wget https://github.com/fboender/ansible-cmdb/releases/download/1.27/ansible-cmdb-1.27-2.noarch.rpm yum -y install ./ansible-cmdb-1.27-2.noarch.rpm2、使用 首先,为你的主机生成 Asible 输出: mkdir…

ToEasy利用99元阿里云服务器内网穿透的实操过程

一、准备工作: 1、阿里云99元服务器(安装Windows)或者其他windows云服务器 2、frp内网穿透软件 3、数据库MSSQL 2014绿色版 4、ToEasy服务器和客户端软件 二、内网穿透设置 解压frp软件后,打开配置文件frps.toml和frpc.toml进行设置。 1、服务端(frps.toml)#bindAddr = &…