理解javascript中的对象属性

从AutoCAD到中望CAD:国产化替代的兼容性实测与平稳迁移指南 在正版化合规与降本增效的双重驱动下,越来越多的设计院和制造企业开始评估CAD软件的国产化替代方案。对于长期依赖AutoCAD的工程师而言,软件切换的核心疑虑往往集中在DWG文件兼容性、操作习惯迁移、二次开发脚本的复用程度以及批量出图效率等基础技术环节。本文从通用CAD应用原理出发,结合实际工程场景,系统梳理了从选型评估、安装部署到字体与外部参照处理、打印样式配置、LISP脚本兼容性验证的完整技术路径,并给出了一套可复制的分阶段落地路线。无论你是关注设计工具选型的技术管理者,还是即将切换绘图环境的一线工程师, 阅读详情

在前面已经有稍微介绍过【 javascript引用类型之object类型 】,今天就具体的说说什么是对象。

在javascript中,对象就是一组无序的名/值对的集合。并且,对象的操作,是对其引用的操作。即,将一个对象赋给一个变量x,实际上也只是将该对象的引用赋给x;倘若又将变量x赋给另一个变量y,那么也只是将y指向x所指向的那个对象。

在【 javascript引用类型之object类型 】中有介绍过创建Object类型实例的方法。对象实例都拥有属性和方法。其实从某种意义上来说,方法也是属性,只不过他的值是个函数。


属性类型

在javascript中,属性可以分为两种,一种是数据属性,另一种是访问器属性。

每个属性都又都包含一个名字和四个特性。

数据属性

对于数据属性而言,它包含了一个数据值的位置,它的值也是其特性之一。因此,它的四个特性分别为:

  • 可配置性(configurable):表示能否通过delete来删除属性,能否修改属性的特性,能否将其修改为访问器属性。若能,则值为true;若不能,则值为false。默认情况下,为true。
  • 可枚举性(enumerable):表示能否通过for/in循环来返回属性。若能,则为true;若不能,则为false。默认情况下为true。
  • 可写性(writable):表示能否修改属性的值。若能,则为true;若不能,则为false。默认为true。
  • 值(value):表示这个属性包含的数据值。读取数据属性时,从这个位置读;写入属性值时,将新值保存在这个位置。

访问器属性

访问器属性不包含数据值。它包含一对getter和setter函数,但是这两个函数不是必须的。当程序查询存取器属性值时,javascript就调用getter()方法,返回属性存取表达式的值;当程序设置存取器属性的值时,javascript就调用setter()方法,将赋值表达式右侧的值当作参数传入setter()。

前面提到,getter()和setter()方法不是必须的。当它同时具有这两个方法时,它是可读/写的;当它只有getter()方法时,它是只读的;当它只有setter()方法时,它是只写的。

存取器属性也同样拥有四个特性,它们分别是:

  • 可配置性(configurable):同数据属性。
  • 可枚举性(enumerable):同数据属性。
  • get:在读取属性时调用的函数。默认值为undefined。
  • set:在写入属性时调用的函数。默认值为undefined。

定义属性

在ECMAscript5中,可以用Object.defineProperty()方法来修改属性默认的特性值。这个方法有三个参数:属性所在的对象,属性的名字和一个描述符对象。其中,描述符对象的属性必须是属性的特性名。

       //数据属性
       var o={};
       Object.defineProperty(o,"x",{value:1,writable:true,enumerable:false,configurable:true});
       alert(o.x);  //1
       o.x=2;
       alert(o.x);  //2
       alert(o.propertyIsEnumerable("x"));  //false
       delete o.x;
       alert(o.x);  //undefined

       Object.defineProperty(o,"y",{value:4,writable:false,enumerable:true,configurable:false});
       alert(o.y); //4
       o.y=44;
       alert(o.y); //4
       alert(o.propertyIsEnumerable("y")); //true
       delete o.y;
       alert(o.y); //4

       //访问器属性
       var book={__year:2004,edition:1};
       Object.defineProperty(book,"year",{
       	    get:function(){
       	    	return this.__year;
       	    },
       	    set:function(newValue){
       	    	if(newValue>2004){
       	    		this.__year=newValue;
       	    		this.edition+=newValue-2004;
       	    	}
       	    }
       });
       book.year=2005;
       alert(book.edition); //2
注意:一旦把属性定义为不可配置的,就不能再将其设置为可配置的了。

定义多个属性

ECMAscript5还定义了一个Object.defineProperties()方法,用于定义多个属性。这个方法有两个参数:第一个参数是属性所在的对象,第二个参数是一个映射表:

       var o={};
       Object.defineProperties(o,{ "x":{value:1,writable:true,enumerable:false,configurable:true},
                                    "y":{value:4,writable:false,enumerable:true,configurable:false}
                                  });
       
       alert(o.x);  //1
       o.x=2;
       alert(o.x);  //2
       alert(o.propertyIsEnumerable("x"));  //false
       delete o.x;
       alert(o.x);  //undefined


       alert(o.y); //4
       o.y=44;
       alert(o.y); //4
       alert(o.propertyIsEnumerable("y")); //true
       delete o.y;
       alert(o.y); //4
在不支持前面提到的两个方法的浏览器中,将不能修改属性的可配置性和可枚举性。

读取属性的特性

在ECMAscript5中,Object.getOwnPropertyDescriptor()方法可以取得给定属性的描述符。返回的是一个对象,如果是访问器属性,该对象的属性有:configurable、enumerable、get和set;如果是数据属性,该对象的属性有:configurable、enumerable、writable和value。

var o={x:1};
alert(Object.getOwnPropertyDescriptor(o,"x").value);  //1
alert(Object.getOwnPropertyDescriptor(o,"x").writable);  //true
alert(Object.getOwnPropertyDescriptor(o,"x").enumerable);  //true
alert(Object.getOwnPropertyDescriptor(o,"x").configurable);  //true

这个方法对于继承或者不存在的属性都将返回undefined:

var o={x:1};
alert(Object.getOwnPropertyDescriptor(o,"y"));  //undefined
alert(Object.getOwnPropertyDescriptor(o,"toString")); //undefined

属性查询和设置

其实前面也有提到过了,可以通过.或者[]来访问对象的属性:

var o1={x:1,y:2};
alert(o1.x);  //1
alert(o1["y"]); //2
注意,当以[]来访问属性时,[]内必须以字符串的形式出现。

也可以通过.和[]来设置属性的值:

var o={};
o.x=1;
o["y"]=2;

alert(o.x);  //1
alert(o.y);  //2
用[]来访问属性时,看起来像是数组。其实,由此也可以看出,javascript中的对象都是关联数组。

删除属性

在javascript中,用delete可以删除对象的属性,并且只能删除对象的自有属性或可配置性为true的属性。至于什么是可配置型,下面会提到。

var o={x:1,y:2};
alert(o.x); //1
delete o.x;
alert(o.x); //undefined
delete运算符只是断开属性与其宿主对象的关系,并不会去操作属性中的属性:

var p={z:1};
var o={x:1,y:p};
alert(o.y); //[object Object]
alert(p.z); //1
delete o.y;
alert(o.y); //undefined
alert(p.z); //1

检测属性

in运算符、hasOwnProperty()和propertyIsEnumerable()方法都可以用来检测属性,不过各自的检测机制不同。

in运算符

in运算符用来检查对象是否包含属性,如果有,不管是自有属性还是继承属性,都将返回true。

var o={x:1,y:2};
alert("x" in o);  //true
alert("z" in o);  //false
alert("toString" in o);  //true

hasOwnProperty()

hasOwnProperty()方法用来检测属性是否是自有属性,如果是,返回true;如果不是,则返回false。

var o={x:1,y:2};
alert(o.hasOwnProperty("x"));  //true
alert(o.hasOwnProperty("toString"));  //false

propertyIsEnumerable()

propertyIsEnumerable()方法用于检测属性是否是可枚举的。默认情况下,自有属性都是可枚举的,而内置属性则是不可枚举的。

var o={x:1,y:2};
alert(o.propertyIsEnumerable("x"));  //true
alert(o.propertyIsEnumerable("toString")); //false

枚举属性

用for/in循环可遍历对象中所有的可枚举属性。前面有提到过,默认情况下,自有属性是可枚举的,内置属性是不可枚举的。但是,属性有个特性可以改变属性的可枚举性(下面会提到)。那么,假如只想获得可枚举的自有属性,并且不包括方法,应该怎么操作呢?

可结合前面提到过的方法来过滤掉一些我们不想得到的属性:

过滤继承属性:
for(p in o){
   if(!o.hasOwnProperty(p)) continue;  
}

过滤方法:
for(p in o){
   if(typeOf o[p]==="function") continue;
}
注意,这边属性是通过[]来访问的,因为我们不知道对象拥有那些属性。这正是用[]来访问属性的重要用途。

在ECMAscript5中,还提供了一种方法来获得对象上所有的可枚举的实例属性。该方法接收一个对象作为参数,返回一个包含该对象中所有可枚举属性的字符串数组。

var o={x:1,y:2};
alert(Object.keys(o)); //x,y




39、深入理解JavaScript中的日期对象:属性和方法 本文深入讲解了JavaScript中Date对象的常用属性和方法,涵盖日期创建、设置与获取、时区处理、格式化输出以及日期计算等内容,并提供了实际应用示例和性能优化建议,帮助开发者全面掌握JavaScript中的日期处理技巧。 阅读详情

相关推荐

Python入门基础教程(非常详细)

Python是一门开源免费、通用型的脚本编程语言,它上手简单,功能强大,坚持「极简主义」。Python类库(模块)极其丰富,这使得Python几乎无所不能,不管是传统的Web开发、PC软件开发、Linux运维,还是当下火热的机器学习、大数据分析、网络爬虫,Python都能胜任。这套Python基础教程不是教科书,不会玩弄概念,而是力求口语化和通俗化,让读者尽快入门。如果有小朋友出于兴趣学习Python,请引导他阅读本教程的前半部分,这是基础,可以降低学习成本;...

Yuki1127918的博客 34万+

JavaScript的数据类型

JavaScript的数据类型包括6种基本类型:undefined、null、布尔值、数字、字符串以及ES6新增的Symbol,还有1种复杂类型:object。由于TypeScript提供了可选的静态类型声明(即在变量后跟一个冒号和类型声明),因此同样的变量声明,在TypeScript中将更能传播代码的意图,并且在编译时还能验证代码的正确性。在下面的代码中,声明了6种类型(不包括Symbol),并...

qq_38082146的博客 272

process插件_利用SPSS 插件MLmed检验多水平中介的调节模型

本文介绍一个SPSS插件,用于检验多水平中介的调节,及该方法与Mplus的比较。1 Mlmed 简介及安装Mlmed 简介: Mlmed 由Rockwood 2017年开发,基于SPSS插件计算Multilevel moderated mediation. 可以提供multilevel mediation Monte Carlo 置信区间比如(模拟20000次),以及多水平调节的...

weixin_39976081的博客 5773

javascript基础--跨域

引言 为什么会有跨域,什么是跨域,这些疑问在没有接触它之前都是正常的。简单的来讲,是因为某些人利用加载外部域的外部脚本代码来搜集原网站信息,以致各种信息泄露,财产损失等现象发生。所以javascript出于安全的角度,提出同源策略,禁止加载不同域下的资源。但是我们开发人员有时的确也有需要使用外部资源,怎么办呢?这就是跨域。 1.什么是跨域域名的组成: 判定方法: 1.当协议,子域名,主域名

Happy joker never give up 501

手把手教你用gmid方法设计二级运放:从理论到仿真全流程(附避坑指南)

本文详细介绍了使用gmid方法设计二级运放的全流程,从理论到仿真实践,特别针对初学者常见问题提供避坑指南。通过系统化的晶体管尺寸确定技术,帮助工程师在性能、功耗和面积之间找到最佳平衡点,适用于模拟集成电路设计中的关键模块开发。

weixin_29213525的博客 272

EEGLAB+ERPLAB实战:从.cnt文件到情绪ERP差异波,一份避坑指南

本文详细介绍了使用EEGLAB和ERPLAB处理Neuroscan的.cnt格式脑电数据的全流程,从数据导入、预处理到情绪ERP差异波生成。重点解决了采样率验证、事件标记检查、重参考选择、滤波策略与ICA组合等实操难题,并提供了情绪图片ERP研究中P1、EPN和LPP成分的分析技巧,帮助研究者避免常见错误,提升数据处理效率。

weixin_26795617的博客 265

【TS】1301- TS 中 never 和 unknown 如何理解?

1、前言TypeScript 在版本 2.0 和 3.0 分别引入了 “never” 和 “unknown” 两个基本类型,在引入这两个类型之后,TypeScript 的类型系统得到了极大的完善。但在我平时接手代码的时候,我发现很多同学的观念还停留在 1.0 的时代,那个 any 大法好的时代。毕竟 JavaScript 是一门弱类型动态语言,我们以往不会投入过多的时间...

pingan8787 2122

用 ADT 连接 SAP S/4HANA Public Cloud 开发租户的完整落地指南

摘要:在SAP S/4HANA公有云中进行ABAP开发时,必须使用Development Tenant(客户端080)而非Customizing Tenant(客户端100)连接ADT工具。开发用户需具备SAP_BR_DEVELOPER角色且写权限不受限,开发对象应创建在结构包的子包中。连接前需确认正确的ABAP服务URL(通常为Launchpad URL去掉"/ui"),并通过运行控制台程序验证全链路功能。典型开发场景如通过BAdI实现业务校验时,需遵循Clean Core原则在指定包

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 339

07.TypeScript never类型、symbol类型

本文介绍了TypeScript中的never类型和symbol类型。never类型表示永不存在的值,常用于抛出异常或无限循环的函数;它可以赋值给任何类型,但其他类型不能赋值给它。void类型表示无返回值,变量只能赋值为undefined/null。两者主要区别在于:never用于函数永不返回,void用于函数无返回值。symbol类型是ES6引入的唯一值标识符,常用于对象属性名,具有不可运算但可显式转为字符串的特性。文章通过代码示例展示了这些类型的定义、使用场景和转换规则。

止于至善 1582

桌面运维工程师面试题详解(一)

桌面运维工程师面试题详解(一)

jks212454的博客 1425

企业 IoT 产品安全渗透测试与欧盟 CRA 合规落地实战指南

欧盟 CRA(网络弹性法案)2026-09-11 漏洞报告义务生效,2027-12-11 全面强制产品安全不再是"加分项",而是市场准入的法律门槛本文面向 IoT 企业安全工程师/运维工程师,讲清楚如何从零建立渗透测试能力,并与 CRA 合规要求对齐落地。不讲空话,全是可执行的步骤。IoT 企业安全工程师、运维工程师负责产品合规的技术人员想从"被动响应"转向"主动安全"的团队[ ] 能独立完成 Web 应用渗透测试并输出报告[ ] 能对 REST/GraphQL API 进行安全评估。

探索云原生与智能化驱动下的安全运维新范式。关注DevSecOps、可观测性、AIOps等前沿领域,与您共赴技术前沿。 269

Typescript - never 类型(详细入门教程)

TS 中 never 类型怎么用,TS类型: never,TS 中 never类型详解,TS全解:never类型怎么用,ts中的void和never类型,TypeScript中的never类型具体有什么用?TS 永远达不到的类型never,TS中never类型是什么,ts never类型详细讲解教程,TypeScript 的 never 类型,TypeScript--Never 类型,Typescript - never 类型(详细入门教程)。

🏆 前端领域优质创作者 2469

RK3568平台(内存篇)DDR定频修改

如果需要DDR定频,则还需要注释掉其他多余的DDR频率,保留一个即可,例如注释掉opp-528000000、opp-1068000000、opp-1560000000,保留opp-2750000000则是定频最大频率。如果回退必须将 dmc_opp_table节点 的其他频率打开,否则系统无法选择到其他频率运行。ddr频点不对,先把ddr变频关掉,关闭后系统就不会一直重启了,以下是修改DDR频点的。rk3588修改定频节点在rk3588s.dtsi 的 dmc: dmc。

weixin_49303682的博客 1622

理解 JavaScript 中的对象属性——数据属性与访问器属性

整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。

老司机的后备箱 712

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

javascript中的面向对象_JavaScript系列之深入理解对象属性

在《谈谈JavaScript中对象建立(Object)》这一文中,我们曾经简单地介绍过对象及其创建方式。在今天这一篇文章当中呢,我们要更深入地来理解JavaScript的对象与其他编程语言的对象有何差异。开始介绍之前先来复习一下。之前说过,所有原始类型(Primitives) 以外的值都是对象,原始类型有以下几种:stringnumberbooleannullundefinedsymbol (ES...

weixin_39655993的博客 58

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

js 理解对象中的属性 (下)

继上一次我们谈了一下关于数据属性的一点知识,本次来简单谈一谈关于访问器属性的一些内容。 访问器属性 访问器属性不包含数据值,它们包含一对getter函数和setter函数。在读取访问器属性时,会调用getter函数,这个函数会返回有效的值.在写入访问器属性时,会调用setter函数并传入新值,这个函数负责如何处理数据。这两个属性不一定需要都进行设置,不设置的情况下会失去相应的作用。比如我们设置了s...

dhycyqn的博客 238

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

彻底理解js中的原型对象和prototype属性

prototype(函数的原型属性) prototype 是一个指向该实例所使用的原型对象的【指针】 prototype 是几乎所有的函数(除了某些内建函数)的属性 prototype 不是一个实例的属性,因为实例是对象,不是函数 //prototype是函数的属性 console.log(Array.prototype.reduce.prototype);//undefined consol...

龙旗飘扬的舰队 1180

JavaScript字符串不是对象,为什么会有属性呢?(理解JavaScript中的包装对象)

实例1: var s = "hello javascript!"; //定义一个字符串 var world = s.substring(s.indexOf(" ")+1, s.length); //使用字符串的方法 实例2: var s=""test"; //创建一个字符串 s.len=4; //给字符串设置一个属性 var t=s.len; //查询这个属性 结果: 在实例1中,可以正常使用...

IT_10的博客 373

重学前端:一文理解 JS Document 对象中的属性和方法

当浏览器加载一个 HTML 文档时,会创建一个 Document 对象,Document 对象是 DOM 树中所有节点的根节点。document.open() 打开一个流,以收集来自 document.write() 或 document.writeln()document.writeln() 等同于 write() 方法,不同的是 writeln() 方法会在末尾输出一个换行符。document.close() 关闭使用 document.open() 方法打开的输出流,并显示选定的数据。

前端梦工厂 987

JavaScript中的属性描述符:深入理解对象属性的控制机制

JavaScript中的属性描述符是一个对象,用于定义或修改对象属性的行为。每个属性都拥有自己的描述符,控制该属性是否可写、可枚举、可配置等特性。value:属性的值,默认为undefinedwritable:布尔值,表示属性值是否可修改enumerable:布尔值,表示属性是否可枚举configurable:布尔值,表示属性描述符是否可更改get:函数,作为属性的getter(读取器),读取属性时执行set:函数,作为属性的setter(设置器),设置属性时执行使用});

Demoncode_y的博客 495

一条容易理解JS标准中的构造器属性、原型对象属性、实例属性的途径

找到一条容易理解JS标准中相关问题的途径,就是把原型对象看作面向对象语言的class。

world_universe的博客 143

简单理解javascript中的原型对象,实现对之间共享属性和行为

javascript中提供了构造函数,能够方便的创建对象。典型的构造函数如下: function Person(name, age) {   this.name = name;   this.age = age;   this.say = function () {     return this.name + ',' + this.age;; }   之后就可以用new和构造函数

aty 2974

重新认识JavaScript-Js面向对象(1): 理解对象

目标 理解对象 创建对象实例 理解Js中的继承 前言 对象是JavaScript的基础 什么是面向对象? 面向对象编程(Object Oriented Programming,缩写为 OOP)是目前主流的编程范式。 它将真实应用场景中各种复杂的关系,抽象出来,用对象之间的协作来模拟这种关系。 所以,对象是对单个实物的抽象,面向对象编程就是将事物之间的关系抽象成对象来实现 Js中的面向...

LeoYY3的博客 317

详解JS中的对象

详细介绍了在JS中对象的相关属性,从语法、类型以及类的属性的各种操作和类的各种遍历,都有详细的介绍

qq_60754128的博客 1172

JavaScript教程-17-关于JavaScript中的对象的介绍

1:对象(object)到底是什么?我们从两个层次来理解 -- 对象是单个实物的抽象。任何一个物体,一本书,一棵树,一张纸,一个数据库,一个链接都是对象。当实物被抽象成对象,实物之间的关系就变成了对象之间的关系,从而就可以模拟现实情况,针对对象进行编程。 -- 对象是一个容器,封装了属性(property)和方法(method)。其中属性是对象的状态,而方法是对象的行为功能。比如可以把狗抽象为...

qq_35938103的博客 155

Javascript中的对象和原型(一)

Javascript中的对象和原型(一) 面向对象的语言(如Java)中有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象。但是,JavaScript 没有类的概念,因此它的对象也与基于类的语言中的对象有所不同。 要了解面向对象,首先就要了解Javascript中的对象和原型。这篇文章中主要学习一下Javascript中的对象。 一 关于对象 对象其实就是一种引用类型。...

abcd3699的博客 125
上一篇: Math对象
下一篇: javascript原型对象、构造函数和实例对象
neverland-7
博客等级 码龄16年 10粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值