目录

创建对象

Object.create()

原型

原型操作

原型污染

对象属性

属性特征

 枚举属性

Object.keys()

Object.getOwnPropertyNames()

 Object.getOwnPropertyDescriptor()

Object.definePeoperty()

Object.definePeoperties()

访问器属性

getter和setter属性

属性访问错误

检测属性

新增方法

Object.is

Object.assign


创建对象

Object.create()

使用Object.create()方法创建一个新对象

// obj1继承了属性x和y。
let obj1 = Object.create({ x: 1, y: 2 });
//obj2是一个普通的空对象。
let obj2 = Object.create(Object.prototype);
//obj3不继承任何属性和方法。
let obj3 = Object.create(null);

Object.create(新对象的原型,新对象的属性描述符)

const animal = {eat() {console.log("Eating...");},
};
const dog = Object.create(animal, {name: { value: "Doggie" },bark: {value: function () {console.log("Barking...");},},
});
dog.eat();
dog.bark();
//输出
//Eating...
//Barking...

原型

每一个JavaScript对象都和原型对象相关联。(每一个对象都从原型继承属性。)

所有通过对象字面量创建的对象都具有同一个原型对象。

通过new和构造函数创建的对象的原型就是构造函数的prototype属性引用的对象。

new Array()对象的原型就是Array.prototype,又继承Object.prototype。

let obj = { value: 100 };
Object.prototype.flag = "head";
console.log(obj.flag);
let arr = [1, 2, 3, 4];
console.log(arr.flag);
//输出
//head
//head

原型操作

Object.getPrototypeOf(对象):查询对象的原型

Object.setPrototypeOf(对象,新的原型对象):为对象重新指定原型对象

obj1.isPrototypeOf(obj2):检测对象obj2是否是对象obj1的原型(obj1是否在obj2的原型链上)

原型污染

修改JavaScript对象的原型链,从而影响所有基于该原型的对象行为。

防御措施:

使用Object.create(null)创建无原型对象;

避免使用__proto__,改用Object.getPrototypeOf()Object.setPrototypeOf()。

对象属性

数据属性:对象属性可以是任意JavaScript值。

属性特征

每个数据属性之间还有一些与之相关的值。

  • 可写:是否可以设置属性值 
  • 可枚举:是否可以通过for/in结构返回该属性
  • 可配置:是否可以删除或修改该属性

 枚举属性

for/in循环可以在循环体中遍历对象中所有可枚举的属性(包括自身属性和继承属性)

let o = Object.create({ m: 10, n: 20 });
o.x = 1;
o.y = 2;
o.z = 3;
for (let p in o) {console.log(p, o[p]);
}
//输出
//x 1
//y 2
//z 3
//m 10
//n 20
Object.keys()

返回一个数组。这个数组由对象中可枚举的自有属性的名称组成。

let o = Object.create({ m: 10, n: 20 });
o.x = 1; o.y = 2; o.z = 3;
console.log(Object.keys(o));
//输出
//[ 'x', 'y', 'z' ]
Object.getOwnPropertyNames()

返回对象的所有自有属性的名称

let o = Object.create({ m: 10, n: 20 });
o.x = 1;
o.y = 2;
o.z = 3;
console.log(Object.getOwnPropertyNames(o));
//输出
//[ 'x', 'y', 'z' ]

 Object.getOwnPropertyDescriptor()

可以获得某个对象特定属性的属性描述符。

console.log(Object.getOwnPropertyDescriptor(circle, "r"));
//{value: 9.549296585513721,writable: true,enumerable: true,configurable: true}

Object.definePeoperty()

传入要修改的对象、要床架或修改的属性的名称以及属性描述符对象。

  • 第一个参数:传入要修改的对象
  • 第二个参数:要创建或修改的属性的名称
  • 第三个参数:属性描述符对象
let o = {};
Object.defineProperty(o, "x", {value: 10,writable: true,enumerable: false,configurable: false,
});
console.log(o.x, Object.keys(o));//10 []

value(属性值),writable(可写性),enumerable(可枚举性),configurable(可配置性)

传入Object.defineProperty()的属性描述符对象不必包含所有4个特性。

Object.definePeoperties()

同时修改或创建多个属性。

  • 第一个参数:要修改的对象
  • 第二个参数:映射表(包含要新建或者修改的属性名称,以及属性的描述)
let p = Object.defineProperties({},{x: { value: 1, writable: true, enumerable: true, configurable: true },y: { value: 1, writable: true, enumerable: true, configurable: true },r: {get: function () {return Math.hypot(this.x, this.y);},enumerable: true,configurable: true,},}
);
console.log(p);//{ x: 1, y: 1, r: [Getter] }

访问器属性

属性可以是一个getter或setter函数。

可写性是由setter方法是否存在决定的。

存取器属性的4个特性是读取(get)、写入(set)、可枚举性和可配置性。

getter和setter属性

getter的返回值就是属性存取表达式的值。

setter负责“设置”属性值。

let circle = {r: 10,get round() {return 2 * this.r * Math.PI;},set round(v) {this.r = v / 2 / Math.PI;},get area() {return Math.PI * this.r ** 2;},
};
console.log(circle.round, circle.area);//62.83185307179586 314.1592653589793
circle.round = 60;
console.log(circle.r, circle.area);//9.549296585513721 286.47889756541167let circle1 = Object.create(circle);
circle1.r = 20;
console.log(circle1.round);//125.66370614359172
circle1.round = 500;
console.log(circle1.r, circle1.area);//79.57747154594767 19894.367886486918

和数据属性一样,存取器属性是可以继承的。

属性访问错误

查询一个不存在的属性并不会报错,返回undefined。

如果对象不存在,查询这个不存在的对象 的属性就会报错。

let one = {};
// let one = { two: { three: 3 } };
console.log(one.two.three);//报错
if (one) {
if (one.two) {
if (one.two.three) console.log(one.two.three);
}
}
console.log(one && one.two && one.two.three);
console.log(one?.two?.three); // Null传导运算符

检测属性

检查属性的方法:

  • in字符串
  • hasOwnPreperty()
  • properlylsEnumerable()
let o = { x: 1 };
console.log("x" in o);//true
console.log("y" in o);//false
console.log("toString" in o);//true
console.log(o.hasOwnProperty("x"));//true
console.log(o.hasOwnProperty("y"));//false
console.log(o.hasOwnProperty("toString"));//false
console.log(o.propertyIsEnumerable("x"));//true
console.log(o.propertyIsEnumerable("y"));//false
console.log(o.propertyIsEnumerable("toString"));//false
console.log(Object.prototype.propertyIsEnumerable("toString"));//false

Object.prototype 包含一个 toString 方法,所以即使对象 o 自身没有定义 toString,in 操作符也会沿着原型链查找到 Object.prototype.toString。

新增方法

Object.is

比较两个值是否相等,返回一个布尔值。

console.log(Object.is(1, 2)); // false
console.log(Object.is(1, "1"), 1 == "1", 1 === "1"); // false true false
console.log(Object.is(NaN, NaN), NaN == NaN, NaN === NaN); // false true false
console.log(Object.is(0, -0), 0 == -0, 0 === -0); // false true true
console.log(Object.is(+0, -0)); // false
console.log(Object.is(+0, 0)); // true

Object.assign

将所有可枚举的自身属性从一个或多个源对象复制到目标对象,返回目标对象。(对象的深层复制

const symbolTag = Symbol("is object");
const defaults = {color: "red",size: "10px",[symbolTag]: "configuration",
};
const options = {color: "blue",opacity: 0.5,
};
const merged = Object.assign({}, defaults, options);
console.log(defaults);
//{ color: 'red', size: '10px', [Symbol(is object)]: 'configuration' }
console.log(options);
//{ color: 'blue', opacity: 0.5 }
console.log(merged);
//{ color: 'blue', size: '10px', opacity: 0.5, [Symbol(is object)]: 'configuration' }

Object.assign()方法不会直接递归对象,如果对象的属性值是一个对象,则会直接复制该对象的引用,而不会复制该对象的属性。

const symbolTag = Symbol("is object");
const defaults = {color: "red",size: "10px",[symbolTag]: "configuration",
};
const options = {color: "blue",opacity: 0.5,
};
const merged = Object.assign({}, defaults, options);
const options2 = {color: "blue",opacity: 0.5,position: { x: 10, y: 20 },
};
const merged2 = Object.assign({}, defaults, options2);
console.log(merged2);
//{
//  color: 'blue',
//  size: '10px',
//  opacity: 0.5,
//  position: { x: 10, y: 20 },
//  [Symbol(is object)]: 'configuration'
//}
console.log(merged2.position === options2.position);
//true

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

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

相关文章

理解图像的随机噪声

图像灰度信息很难精确测量,一般情况下测量值总在真实值附近晃动,使用概率模型可以对该随机性建模,大致如下: 1 概率密度函数 1)随机变量 x 的概率密度函数 p(x) 定义为:当 趋近于 0 时,在区间 上…

华为云镜像仓库下载 selenium/standalone-chrome 镜像

你可以使用以下步骤从华为云镜像仓库下载 selenium/standalone-chrome 镜像&#xff1a; 1. 登录华为云镜像仓库&#xff08;如果需要认证&#xff09; bash sudo docker login -u <用户名> -p <密码> swr.cn-north-4.myhuaweicloud.com 如果没有华为云账号&…

Push-T, AloHa, Rlbench三个仿真环境信息

1.Push-T 很好兄弟&#xff0c;你问得很关键&#xff1a;你给我的三段代码其实是一套完整的推理录像 pipeline&#xff0c;它们之间既有独立功能&#xff0c;又有顺序依赖关系。我来帮你分段解释&#xff0c;每段是什么功能、三段之间怎么配合&#xff0c;让你彻底搞明白。 &a…

Linux信号机制:从入门到精通

嘿&#xff0c;小伙伴们&#xff01;今天我要和大家聊一个Linux系统中非常有趣又重要的话题——信号机制。别担心&#xff0c;虽然信号听起来有点高深&#xff0c;但我会用最通俗易懂的语言&#xff0c;配合清晰的图表&#xff0c;带你彻底搞懂这个概念&#xff01; 什么是信号…

Vue3项目引入高德地图【超详细教程】

前言 在 Vue 3 项目中集成高德地图&#xff08;AMap&#xff09;是一个常见的需求。本文将详细介绍如何在 Vue 3 项目中使用高德地图&#xff0c;包括安装配置、基本使用以及一些进阶功能的实现。 一、环境准备 1.1 vue3项目初始化 步骤 1&#xff1a;初始化项目 npm crea…

blender mcp安装(完全免费的ai建模)

1.最关键的一步&#xff0c;建议最早执行(就是安装uvx) mac系统执行 brew install uvwindows执行 powershell -c "irm https://astral.sh/uv/install.ps1 | iex" 出现这一步就成功安装uvx了&#xff0c;因为mcp需要使用uvx 2.第二步骤 github地址: https://gith…

GIS开发入门教程与笔记分享

大家好&#xff0c;我是地信小学生&#xff0c;距离5月3日发布暂停更新以来&#xff0c;也一两个月啦&#xff0c;这期间也陆陆续续更新了点内容。 我自己写的笔记主要是以入门笔记为主&#xff0c;真正的内容并不多&#xff0c;包括&#xff1a;GIS基础、PostgreSQLPostGIS入门…

设计模式-代理模式、装饰者模式

代理模式 Proxy&#xff08;代理&#xff09;—对象结构型模式定义&#xff1a;给某一个对象提供一个代理对象&#xff0c;并由代理对象控制原有对象的引用。 代理模式的核心思想是&#xff1a;创建一个代理对象&#xff0c;代理对象在调用目标方法时&#xff0c;可以插入额外…

国产安路FPGA纯verilog视频图像去雾,基于暗通道先验算法实现,提供5套TD工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目国产安路FPGA相关方案推荐本博主已有的图像处理方案 3、设计思路框架工程设计原理框图输入Sensor之-->GC0308摄像头输入Sensor之-->OV7725摄像头输入Sensor之--…

Windows商店中的简笔画学习应用

此应用包含动物、植物、人物、交通工具、卡通等类别超过1500张线条图片&#xff0c;支持图片临摹和图片填色&#xff0c;可以将绘图和填色结果保存成文件&#xff0c;也可以打开本地图片进行临摹和填色。 菜单说明 右侧绘图区上方菜单功能包括&#xff1a;打开文件&#xff1…

树莓派4B --ubundu20.04 机载电脑配置WIFI热点

不要用刷机过程配置WIFI账号&#xff0c;因为在那里配置的WIFI都是不受控的&#xff0c;会出很多问题。 1.安装网络 sudo apt-get install network-manager 2.将源码CLONE到本地 sudo git clone https://github.com/oblique/create_ap cd create_ap sudo make install 当你…

​​JETSON NANO B01​ 在AIOT 的领域的作用

低功耗边缘设备的理想选择 &#x1f449; ​​适合人群​​&#xff1a;精打细算、小厂搞智能监控的 ​​Jetson Nano B01​​&#xff08;4GB内存/0.47TOPS算力&#xff09;&#xff0c;JetBot (NVIDIA社区版) 机器人/自动驾驶项目​ ​​硬件​​&#xff1a;Jetson Nano B0…

Kioptrix Level2

靶机截图 收集信息 主机发现 打开靶机后&#xff0c;用kali探测靶机的 IP arp-scan-l 可以用nmap进行同网段扫描探测存活ip nmap -sP 10.4.7.0/24 端口扫描 命令过程 nmap -sT -sV -p- -O 10.4.7.220 -sT&#xff1a;TCP连接扫描 -sV&#xff1a;服务版本探测 -p-&#x…

Word之电子章制作——1

第一步&#xff1a;在插入 ——形状哪里选择一个圆形&#xff0c;并且下一步按住shift键拉出一个正圆形。 第二步&#xff1a;鼠标右键去掉背景颜色&#xff0c;边框粗细设置成3磅。 第三步&#xff1a;在插入导航窗找到艺术字&#xff0c;点击大写的A&#xff0c;输入公司名字…

LeetCode 2799.统计完全子数组的数目

给你一个由 正 整数组成的数组 nums 。 如果数组中的某个子数组满足下述条件&#xff0c;则称之为 完全子数组 &#xff1a; 子数组中 不同 元素的数目等于整个数组不同元素的数目。 返回数组中 完全子数组 的数目。 子数组 是数组中的一个连续非空序列。 示例 1&#xff1…

33.表复制和去重

1.表结构的复制(LIKE) 当我们想复制一个表的时候&#xff0c;首先需要创建一个与被复制表相同结构的表。这时候就要用到关键字like&#xff1a; 语法使用&#xff1a; create table table_name LIKE temp_table 示例&#xff1a;复制一个和表emp&#xff08;老朋友了&#…

GitLab 18.1 正式发布Maven 虚拟仓库、密码泄露检测等功能,可升级体验!

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…

蓝牙网络拓扑面试通关:微微网与散射网原理 + 真题解析

为什么面试官总爱问蓝牙拓扑? 你可能有过这样的经历:面试嵌入式 / 物联网 / 无线通信岗位时,面试官突然问:“蓝牙的微微网和散射网有什么区别?” 别慌!这不是在考你背定义,而是考察你对无线通信核心逻辑的理解 ——如何用有限资源实现高效组网。 蓝牙作为短距离无线通信…

[Python]-基础篇1- 从零开始的Python入门指南

无论你是尚未接触编程的新手,还是想从其他语言转向Python的开发者,这篇文章都是你的入门课。 一、Python是什么? Python是一种解释型、高级、通用型编程语言,以简洁明了、简单易用着称。它可以应用于网站开发、自动化脚本、数据分析、人工智能、系统操作等多种场景。 二、…

Objective-C面向对象编程:类、对象、方法详解(保姆级教程)

目录 一、核心概念 二、类的定义&#xff08;分.h和.m文件&#xff09; 1. 头文件&#xff08;.h&#xff09;—— 公开声明 2. 实现文件&#xff08;.m&#xff09;—— 具体实现 3. 属性特性解析 原子性 所有权语义(ARC环境下) 读写控制 三、对象创建与内存管理 1…