JS对象详解

article/2025/9/21 1:28:00

JS对象详解

js的对象是什么?js的对象类型有哪些?具体实例是什么?

一、ECMA-262对JS对象的定义:

属性的无序集合,每个属性存放一个原始值、对象或函数;
对象是无特定顺序的值的数组;
对象是一种特殊的数据类型,可以包含多个成员。

对象成员:Property、Method。(Object=Property+Method)
属性(Property):对象名、属性名。封装对象的数据,表示与对象有关的值;
方法(Method):对象名、方法名。封装对象的行为,表示对象可以执行的行为或可以完成的功能;

二、JS的对象类型:

1. 内部对象:原生对象/内置对象

1)原生对象,ECMAScript提供的需要实例化(new)才能使用的对象

Object对象、Function对象、Array 对象、Boolean 对象、Date 对象、Number 对象、String对象、RegExp 对象、运算符、Error、Set对象、Map对象、Proxy 对象

      原生对象常用方法:①、Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。②、Object.create() 方法用于创建一个新对象。被创建的对象会继承另一个对象的原型,在创建新对象时还可以指定一些属性。③、Object.defineProperties() 直接在一个对象上定义新的属性或修改现有属性,并返回该对象。④、Object.keys() 遍历对象,返回一个数组,包含了该对象自身的所有可枚举属性名⑤、Object.getOwnPropertyNames() 遍历对象,返回一个数组,包含了该对象自身的可枚举和不可枚举属性名⑥、Object.is() 方法用于判断两个值是否是相同的值⑦、Object.entries() 方法返回一个给定对象自身可枚举属性的键值对数组,其排列与使用for...in循环遍历该对象时返回的顺序一致⑧、Object.freeze()方法可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。此外,冻结一个对象后该对象的原型也不能被修改。freeze() 返回和传入的参数相同的对象。

2)内置对象,ECMAScript提供的不需要实例化就能使用的对象

Global (全局对象)和 Math对象

2. 宿主对象

宿主对象就是执行JS脚本的环境提供的对象,是浏览器提供的对象,用于完善ECMAScript 执行环境。早期存在较⼤的兼容性问题,当前其中⼀些主要的对象已经被⼤部分浏览器兼容,具体分为如下两⼤类:
1)BOM对象(Browser Object Model)

Window、Navigator、Screen、History、Location

2)DOM对象(Document Object Model)

Document、Anchor、Area、Base、Body、Button、Canvas、Event、Frame、Frameset、IFrame、Image、Link、Meta、Style、Form、Input Button、Input CheckBox、Input File、Input Hidden、Input Password、Input Radio、Input Reset、Input Submit、Input Text、Option、Select、Textare、Table、TableCell、TableRow

3. 自定对象

开发人员自己定义的对象。自定义对象的方法如下:

(1)对象字面量方式(通过JSON来创建对象)
var obj1 = {}var obj2 = {x:0,y:0}var obj3 = {name:‘Mary’,age:18}

缺点:使用同一个接口创建很多对象,会产生大量的重复代码。

(2)工厂模式。
function createPerson(name,age,actor){var person = new Object();person.name = "rose";person.age = 18;person.job = "actor";person.sayName = function () {console.log(this.name);};return person
}
console.log(p1 instanceof Object);//true
console.log(p1 instanceof createPerson);//false

①工厂模式就是将创建对象的语句放在一个函数里,通过传入参数来创建特定对象,最后返回创建的对象。

函数createPerson()能够根据接受到的参数来构建一个包含所有必要信息的Person对象。

可以无数次的调用这个函数,而每次它都会返回一个包含2个属性和一个方法的对象。

②缺点:工厂模式虽然可以创建多个相似的对象,但却不能解决对象标识的问题,即怎样知道一个对象的类型。

(3)创建一个 Object 实例
var person = new Object();
person.name = "rose";
person.age = 18;
person.job = "actor";
person.sayName = function () {console.log(this.name);
};
console.log(person); 
(4)构造函数模式
var obj1 = new Arrayvar obj2 = new Date();

①缺点:使用构造函数的主要问题是:每个方法都要在每个实例上创建一遍。

②在ECMAScript中,函数即对象,因此每定义一个函数,也就是实例化了一个对象。

③也就是说通过构造函数实例化的多个对象的方法,是多个不同的方法,但它们内部的代码以及实现的功能是相同的,这就造成了一定的资源浪费。

(5)原型模式
function Student() {}
Person.prototype.name = "rose";
Person.prototype.age = 18;
Person.prototype.sayName = function () {console.log(this.name);
};
var p = new Student();
console.log(p);

①js中,每个函数都有一个prototype属性,它是一个指针,指向一个对象,叫做原型对象。
在这里插入图片描述

②使用原型模式可以让所有的实例共享原型对象中的属性和方法,也就是说,不必再构造函数中定义对象实例的信息。

③缺点:省略了为构造函数传递初始化参数这一环节,结果所有实例在默认情况下都将取得相同的属性值。

原型模式的最大问题是由共享的本性所导致的。原型中所有属性是被很多实例共享的
这种共享对于函数非常合适。对于包含引用类型的属性来说,问题就比较突出了。因此,很少单独使用原型模式。

(6)组合使用构造函数模式和原型模式
function Person(name, age) {this.name = name;this.age = age;
}
Person.prototype.sayName = function () {console.log(this.name);
};
var p = new Person("rose", 18);
console.log(p);

①组合使用构造函数模式和原型模式,是创建自定义类型的最常见方式。对象在引用其属性的时候,会按照原型链去查找,直到查找到Object的原型。

②构造函数模式用于定义实例属性,而原型模式用于定义方法和共享的属性。

③结果,每个实例都会有自己的一份实例属性的副本,但同时又共享着对方法的引用,最大限度的节省了内存。
在这里插入图片描述

(7)其他模式

①动态原型模式:仅在第一次调用构造函数时,将方法赋给原型对象的相应属性,其他示例的处理方式同构造函数模式

②寄生构造函数模式:仅仅封装创建对象的代码,然后再返回新创建的对象,仍使用new操作符调用

③稳妥构造函数模式:没有公共属性,只有私有变量和方法,以及一些get/set方法,用以处理私有变量。


http://chatgpt.dhexx.cn/article/Wq0V6KVC.shtml

相关文章

初学JavaScript:js中的对象(对象+原型对象)

文章目录 js对象详解1、创建对象字面量模式创建对象构造函数模式创建对象 2、访问对象访问属性访问方法 3、遍历对象中的属性和属性值4、往对象中新添属性5、删除对象中的属性6、Object显示类型转换(强制类型转换)7、检查属性所属对象7.1 in7.2 Object.prototype.hasOwnPropert…

java testng_java—TestNG单元测试框架

//依赖坐标 org.testng testng 6.14.3 test TestNG的常用注解 1、Test 标记为测试方法 2、 BeforeMethod/AfterMethod 在某个测试方法(method)执行之前/结束之后 3、BeforeClass/AfterClass 在某个测试类(class)所有开始之前/结束之后 4、BeforeTest/AfterTest 在某个测试(test…

TestNG教程三:TestNG中的监听

TestNG中的监听 1.使用监听的目的: Testng虽然提供了不少强大的功能和灵活的选项,但不能解决所有的问题,使用监听器就是用来定制额外的功能以满足我们的需求的; 2.监听器具体实现: 监听器实际上是一些预定义的java接…

TestNG教程二:testNG常用测试类型

1.异常测试 package com.testngdemo; import org.testng.annotations.Test; public class test { Test(expectedExceptions ArithmeticException.class ) public void divisionWithException() { int i 1 / 0; System.out.println("After division the value of i is…

TestNg学习

TestNG是一个测试框架,可以简化广泛的测试需求。 建立工程 首先我们在idea中应该新建一个project,并选择“maven”,点击下一步(如下图) 填写groupId(一般为包名)和ArtifactId(一般…

TestNG教程一:testNG简介

1.TestNG是什么? TestNG是一个测试框架,其灵感来自JUnit和NUnit,但引入了一些新的功能,使其功能更强大,使用更方便。 TestNG是一个开源自动化测试框架;TestNG表示下一代(Next Generation的首字母)。 TestNG类似于JUnit(特别是JU…

TestNG用法

【bak】https://www.cnblogs.com/uncleyong/p/15855473.html TestNG简介 单元测试框架&#xff0c;可以用来设计用例的执行流程 创建maven项目&#xff0c;添加依赖 <dependency><groupId>org.testng</groupId><artifactId>testng</artifactId>&…

testNG - 无法访问org.testng.Assert

【异常】无法访问org.testng.Assert 问题表现问题排查问题解决 问题表现 问题排查 报错的是无法访问Assert类&#xff0c;我琢磨着这个类是testNG中很常用的一个类&#xff0c;怎么会找不到&#xff1f; 先从项目的jar包中管理入手&#xff0c;看看有没有其他毛病。 果不其然…

TestNG-学习笔记

https://testng.org/doc/documentation-main.html TestNG概述 TestNG is a testing framework inspired from JUnit and NUnit but introducing some new functionalities that make it more powerful and easier to use, such as: Annotations. Run your tests in arbitrar…

TestNG的使用

testng在maven项目中的使用 pom.xml <dependencies><dependency><groupId>org.testng</groupId><artifactId>testng</artifactId><version>7.4.0</version><scope>test</scope></dependency> </depend…

TestNG

1 TestNG简介 TestNG是Java中的一个测试框架&#xff0c;是一个目前很流行实用的单元测试框架&#xff0c;有完善的用例管理模块&#xff0c;配合Maven能够很方便管理依赖第三方插件。 TestNG消除了大部分的旧框架的限制&#xff0c;使开发人员能够编写更加灵活和强大的测试。…

TestNG自动化测试框架详解

TestNG 文章目录 TestNG一、概述与使用1.1 配置环境1.2 测试方法1.3 使用xml文件 二、测试方法常用注解2.1 配置类注解2.2 非配置类注解2.2.1 Parameters2.2.2 DataProvider 三、依赖测试四、忽略测试五、超时测试六、分组测试七、失败重试机制7.1 IRetryAnalyzer接口7.2 测试方…

TestNG整理

1 基本概念 TestNG:即Testing, Next Generation,下一代测试技术,是根据JUnit和NUnit思想,采用jdk的annotation技术来强化测试功能并借助XML 文件强化测试组织结构而构建的测试框架。最新版本5.12,Eclipse插件最新版本:testng-eclipse-5.12.0.6 TestNG的应用范围: 单…

TestNG使用教程详解

一、TestNG介绍 TestNG是Java中的一个测试框架&#xff0c; 类似于JUnit 和NUnit, 功能都差不多&#xff0c; 只是功能更加强大&#xff0c;使用也更方便。 详细使用说明请参考官方链接&#xff1a;TestNG - Welcome WIKI教程&#xff1a;TestNG - 小组测试( Group Test)_学习…

TestNG单元测试框架详解

目录 前言 ​1. TestNG使用流程 1.1TestNG安装 1.2 创建Maven项目 1.3 Maven配置 1.4 项目TestNG测试类 1.5 运行TestNG 2、TestNG常用注解 3.xml方式运行 3.1 鼠标右击testng.xml运行 3.1 使用maven运行 4. 常用的断言&#xff08;assert&#xff09; 5. TestNG预…

使用ZRender类库画直线、圆弧、曲线以及点在线上的运动

最近在学习Zrender类库&#xff0c;并利用Zrender 让点在直线、圆弧、曲线上运动。大概的写了一些. Zrender是二维绘图引擎&#xff0c;它提供 Canvas、SVG、VML 等多种渲染方式。ZRender 也是 ECharts 的渲染器. 这里我运用的是Canvas画布去画的.想了解Zrender内的属性&…

js画图插件-zrender

zrender&#xff08;Zlevel Render&#xff09; 是一个轻量级的Canvas类库&#xff0c;MVC封装&#xff0c;数据驱动&#xff0c;提供类Dom事件模型&#xff0c;让canvas绘图大不同&#xff01; MVC核心封装实现图形仓库、视图渲染和交互控制&#xff1a; Stroage(M) : shape数…

ZRender文档研读

ZRender文档研读 (基于4.3.2版本) 不使用最新的5.x.x的版本是因为线上文档和最新版本JS文件不匹配-2022年6月13日 1、文档地址 1、官方文档的地址&#xff1a;https://ecomfe.github.io/zrender-doc/public/api.html#zrenderdisplayable 2、Github地址&#xff1a;https://git…

React Developer Tools 下载

React Developer Tools 下载 方法一&#xff1a;网页扩展工具 搜索 React Developer Tools 下载&#xff08;若浏览器不支持搜索React &#xff0c;行不通&#xff09; 打开chrome 浏览器 (只有 chrome 支持 React Developer Tools&#xff09;点击网页工具栏 右上方 确认添…

zrender TypeError: “x“ is not a constructor

如果有兴趣了解更多相关内容&#xff0c;欢迎来我的个人网站看看&#xff1a;耶瞳空间 我是调用zrender的init方法报错&#xff0c;如下图&#xff1a; 然后经过大佬指点&#xff0c;这种开发环境没问题但生产环境报错的东西&#xff0c;一般是因为打包的时候被tree-shaking…