精华内容
下载资源
问答
  • JS操作对象属性(获取、添加、删除、修改对象属性) 属性也称为名值对,包括属性名和属性值。属性名可以是包含空字符串在内的任意字符串,一个对象中不能存在两个同名的属性。属性值可以是任意类型的数据。 1. 直接...

    JS操作对象属性(获取、添加、删除、修改对象属性)

    属性也称为名值对,包括属性名和属性值。属性名可以是包含空字符串在内的任意字符串,一个对象中不能存在两个同名的属性。属性值可以是任意类型的数据。

    1. 直接量定义
    在对象直接量中,属性名与属性值之间通过冒号分隔,冒号左侧是属性名,右侧是属性值,名值对(属性)之间通过逗号分隔。
    [示例1]
    在下面示例中,使用直接量方法定义对象 obj,然后添加了两个成员,一个是属性,另一个是方法。

    var obj = {
        x : 1,
        y : function () {
            return this.x + this.x;
        }
    }
    

    2. 点语法定义
    示例2
    通过点语法,可以在构造函数内或者对象外添加属性。

    var obj = {};
    obj.x = 1;
    obj.y = function () {
        return this.x + this.x;
    }
    

    3. 使用 Object.defineProperty
    使用 Object.defineProperty() 函数可以为对象添加属性,或者修改现有属性。如果指定的属性名在对象中不存在,则执行添加操作;如果在对象中存在同名属性,则执行修改操作。

    具体用法如下:

    Object.defineProperty(object, propertyname, descriptor);

    参数说明如下:
    object:指定要添加或修改属性的对象,可以是 JavaScript 对象或者 DOM 对象。
    propertyname:表示属性名的字符串。
    descriptor:定义属性的描述符,包括对数据属性或访问器属性。

    Object.defineProperty 返回值为已修改的对象。
    示例3
    下面示例先定义一个对象直接量 obj,然后使用 Object.defineProperty() 函数为 obj 对象定义属性,属性名为 x,值为 1,可写、可枚举、可修改特性。

    var obj = {};
    Object.defineProperty(obj, "x", {
        value : 1,
        writable : true,
        enumerable : true,
        configurable : true
    });
    console.log(obj.x);  //1
    

    4. 使用 Object.defineProperties
    使用 Object.defineProperties() 函数可以一次定义多个属性。具体用法如下:

    object.defineProperties(object, descriptors);

    参数说明如下:
    object:对其添加或修改属性的对象,可以是本地对象或 DOM 对象。
    descriptors:包含一个或多个描述符对象,每个描述符对象描述一个数据属性或访问器属性。
    示例4
    在下面示例中,使用 Object.defineProperties() 函数将数据属性和访问器属性添加到对象 obj 上。

    var obj = {};
    Object.defineProperties(obj, {
        x : {  //定义属性x
            value : 1,
            writable : true,  //可写
        },
        y : {  //定义属性y
            set : function (x) {  //设置访问器属性
                this.x = x;  //改写obj对象的x属性的值
            },
            get : function () {  //设置访问器
                return this.x;
            },
        }
    });
    obj.y = 10;
    console.log(obj.x);  //10
    

    读写属性

    1. 使用点语法
    使用点语法可以快速读写对象属性,点语法左侧是引用对象的变量,右侧是属性名。
    示例1
    下面示例定义对象 obj,包含属性 x,然后使用点语法读取属性 x 的值。

    var obj = {  //定义对象
        x : 1
    }
    console.log(obj.x);  //访问对象属性x,返回1
    obj.x = 2;  //重写属性值
    console.log(obj.x);  //访问对象属性x,返回2
    

    2. 使用中括号语法
    从结构上分析,对象与数组相似,因此可以使用中括号来读写对象属性。
    示例2
    针对上面示例,可以使用中括号来读写对象属性。

    console.log(obj["x"]);  //2
    obj["x"] = 3;  //重写属性值
    console.log(obj["x"]);  //3
    

    【注意事项】
    在中括号语法中,必须以字符串形式指定属性名,不能使用标识符。
    中括号内可以使用字符串,也可以使用字符型表达式,即只要表达式的值为字符串即可。
    示例3
    下面示例使用 for/in 遍历对象的可枚举属性,并读取它们的值,然后重写属性值。

    for (var i in obj) {
        console.log(obj[i]);
        obj[i] = obj[i] + obj[i];
        console.log(obj[i]);
    }
    

    在上面代码中,中括号中的表达式 i 是一个变量,其返回值为 for/in 遍历对象时枚举的每个属性名。
    3. 使用 Object.getOwnPropertyNames
    使用 Object.getOwnPropertyNames() 函数能够返回指定对象私有属性的名称。私有属性是指用户在本地定义的属性,而不是继承的原型属性。具体用法如下:

    Object.getOwnPropertyNames(object);

    参数 object 表示一个对象,返回值为一个数组,其中包含所有私有属性的名称。其中包括可枚举的和不可枚举的属性和方法的名称。如果仅返回可枚举的属性和方法的名称,应该使用 Object.keys() 函数。
    示例4
    在下面示例中定义一个对象,该对象包含三个属性,然后使用 getOwnPropertyNames 获取该对象的私有属性名称。

    var obj = {x : 1, y : 2, z : 3};
    var arr = Object.getOwnPropertyNames(obj);
    console.log(arr);  //返回属性名:x,yz
    
    1. 使用 Object.keys
      使用 Object.keys() 函数仅能获取可枚举的私有属性名称。具体用法如下:

    Object.keys(object);

    参数 object 表示指定的对象,可以是 JavaScript 对象或 DOM 对象。返回值是一个数组,其中包含对象的可枚举属性名称。
    5. Object.getOwnPropertyDescriptor
    使用 Object.getOwnPropertyDescriptor() 函数能够获取对象属性的描述符。具体用法如下:

    Object.getOwnPropertyDescriptor(object, propertyname);

    参数 object 表示指定的对象,propertyname 表示属性的名称。返回值为属性的描述符对象。
    示例5
    在下面示例中定义一个对象 obj,包含 3 个属性,然后使用 Object.getOwnPropertyDescriptor() 函数获取属性 x 的数据属性描述符,并使用该描述符将属性 x 设置为只读。最后,调用 Object.defineProperty() 函数,使用数据属性描述符修改属性 x 的特性。遍历修改后的对象,可以发现只读属性 writable 为 false。

    var obj = {x : 1, y : 2, z : 3};  //定义对象
    var des = Object.getOwnPropertyDescriptor(obj, "x");  //获取属性x的数据属性描述符
    for (var prop in des) {  //遍历属性描述符对象
        console.log(prop + ':' + des[prop]);  //显示特性值
    }
    des.writable = false;  //重写特性,不允许修改属性
    des.value = 100;  //重写属性值
    
    Object.defineProperty(obj, "x", des);  //使用修改后的数据属性描述符覆盖属性x
    var des = Object.getOwnPropertyDescriptor(obj, "x");  //重新获取属性x的数据属性描述符
    for (var prop in des) {  //遍历属性描述符对象
        console.log(prop + ':' + des[prop]);  //显示特性值
    }
    

    一旦为未命名的属性赋值后,对象就会自动定义该属性的名称,在任何时候和位置为该属性赋值,都不需要定义属性,而只会重新设置它的值。如果读取未定义的属性,则返回值都是 undefined。

    删除属性

    使用 delete 运算符可以删除对象的属性。
    示例
    下面示例使用 delete 运算符删除指定属性。

    var obj = {x : 1};  //定义对象
    delete obj.x;  //删除对象的属性x
    console.log(obj.x);  //返回undefined
    

    当删除对象属性之后,不是将该属性值设置为 undefined,而是从对象中彻底清除属性。如果使用 for/in 语句枚举对象属性,只能枚举属性值为 undefined 的属性,但不会枚举已删除属性。
    使用方法
    方法也是函数,当函数被赋值给对象的属性,就被称为方法。方法的使用与函数是相同的,唯一的不同点是在方法内常用 this 引用调用对象,其实在普通函数内也有 this,只不过不常用。

    使用点语法或中括号可以访问方法,使用小括号可以激活方法。
    示例1
    与普通函数用法一样,可以在调用方法时传递参数,也可以设计返回值。

    var obj = {};
    obj.f = function (n) {  //定义对象的方法
        return 10 * n;
    }
    var n = obj.f(5);  //调用方法,设置参数为5
    console.log(n);  //返回值50
    

    示例2
    在方法内 this 总是指向当前调用对象。在下面示例中,当在不同运行环境中调用对象 obj 的方法 f() 时,该方法的 this 指向时不同的。

    var obj = {  //定义对象
        f : function () {  //定义对象的方法
            console.log(this);  //访问当前对象
        }
    }
    obj.f();  //此时this指向对象obj
    var f1 = obj.f;  //引用对象obj的方法f
    f1();  //此时this指向对象window
    
    展开全文
  • javascript修改对象属性的正确姿势

    千次阅读 2019-01-24 10:20:28
    修改对象属性前言Object.assign()...扩展运算符 前言 eslint有一条规则no-param-reassign,意思是禁止修改函数的属性。 若函数的属性是对象,此时不能修改对象属性。有什么方法呢? 方法有二种,如下: var obj = { ...

    前言

    eslint有一条规则no-param-reassign,意思是禁止修改函数的属性。
    若函数的属性是对象,此时不能修改对象属性。有什么方法呢?
    方法有二种,如下:

    var obj = {
    	a: 1,
    	b: 2
    }
    

    Object.assign()

    Object.assing() 方法将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。

    function rewrite(...sources){
    	return Object.assign({}, ...sources)
    }
    obj = rewrite(obj, {b: 3})
    

    …扩展运算符

    …扩展运算符可以将对象打开,合并成一个新对象

    function rewrite(origin, source){
    	return {...origin, ...source}
    }
    obj = rewrite(obj, {b: 3})
    
    展开全文
  • 一、修改对象属性 效果: /** * Description: * date: 2020/11/26 * 修改对象的属性 更新信息工具类 * @param : tClass 实体类class * @param : fieldName 实体类属性名 * @param : values 修改的内容 * @...

    一、修改对象属性

    效果:
    在这里插入图片描述

    /**
         * Description:
         * date: 2020/11/26
         * 修改对象的属性 更新信息工具类
         * @param : tClass 实体类class
         * @param : fieldName 实体类属性名
         * @param : values 修改的内容
         * @return : 失败返回hashMap格式;成功返回实体类
         * @author: qkj
         */
    
        public static Object modifyEntityInfo(Class<?> tClass, String fieldName, Object values) throws Exception {
            Method[] declaredMethods = tClass.getDeclaredMethods();
            int length = declaredMethods.length;
            Constructor<?> constructor = tClass.getConstructor();
            Object instance = constructor.newInstance();
            List<String> methodNameList = new ArrayList<String>();
    
            for (int i = 0; i < length; i++) {
                declaredMethods[i].setAccessible(true);
                methodNameList.add(declaredMethods[i].getName().toUpperCase());
            }
            boolean contains = methodNameList.contains("SET" + fieldName.toUpperCase());
    
            if (!contains) {
                Map<String, String> map = new HashMap<String, String>();
                map.put("errorMsg", "字段名错误或者实体类不存在set方法");
                return map;
            } else {
                Method realMethod = null;
                for (int i = 0; i < length; i++) {
                    declaredMethods[i].setAccessible(true);
                    if (declaredMethods[i].getName().equalsIgnoreCase("SET" + fieldName)) {
                        realMethod = declaredMethods[i];
                        break;
                    }
                }
    
                realMethod.invoke(instance, values);
    
                return instance;
    
            }
    
        }
    

    二、对象互换属性值

    实际应用场景:属性值互换 并忽略某几项(例如id不用互换)
    将动态参数,反射,动态代理,反序列化,深拷贝结合在一起的一个方法
    在这里插入图片描述

    //注意需要jackson包  或者自己将实体类继承序列化、克隆等接口也行,深拷贝时用到,将深拷贝部分的代码重新写一下
    import com.fasterxml.jackson.databind.ObjectMapper;
      /**
         * Description: 对象信息互换
         * date: 2020/11/26
         * @param : object1 object2互换对象
         * @param : ...param 需要忽略互换的字段
         * @return : 失败返回hashMap格式;成功返回实体类list
         * @author: qkj
         */
    
        public static Object exchangeEntityInfo(Object object1, Object object2, Object... param) throws Exception {
            Class aClass1 = object1.getClass();
            Class aClass2 = object2.getClass();
    
            if (aClass1 != aClass2) {
                Map<String,String> map = new HashMap<String, String>();
                map.put("error", "类型不一致");
                return map;
            }
    
            ObjectMapper objectMapper = new ObjectMapper();
            Object temp1 = objectMapper.readValue(objectMapper.writeValueAsString(object1), object1.getClass());
            Object temp2 = objectMapper.readValue(objectMapper.writeValueAsString(object2), object2.getClass());
    
            object1 = object2;
            object2 = temp1;
    
            // 所有属性
            Field[] declaredFields = object1.getClass().getDeclaredFields();
            // 所有方法
            Method[] declaredMethods = object1.getClass().getDeclaredMethods();
    
            ArrayList<Object> objects = new ArrayList<>();
            // 循环无需替换的参数
            for (int i = 0; i < param.length; i++) {
                // 循环交换后对象的方法
                for (Method method : declaredMethods) {
                    method.setAccessible(true);
                    // 如果方法名相等 则把旧数据set回去
                    if (method.getName().equalsIgnoreCase("SET" + param[i])) {
                        for (Field field : declaredFields) {
                            if (field.getName().equals(param[i])) {
                                method.invoke(object1, field.get(temp1));
                            }
                        }
    
                        for (Field field : declaredFields) {
                            if (field.getName().equals(param[i])) {
                                method.invoke(object2, field.get(temp2));
                            }
                        }
    
                    }
                }
            }
    
            objects.add(object1);
            objects.add(object2);
    
            return objects;
        }
    
    
    展开全文
  • vue:修改对象属性 页面不重新渲染

    千次阅读 2019-01-25 13:45:59
    vue 修改对象属性 页面不重新渲染官方解释:解决办法注意事项 官方解释: Vue 不能检测到对象属性的添加或删除。由于 Vue 会在初始化实例时对属性执行 getter/setter 转化过程,所以属性必须在 data 对象上存在才能...

    官方解释:

    Vue 不能检测到对象属性的添加或删除。由于 Vue 会在初始化实例时对属性执行 getter/setter 转化过程,所以属性必须在 data 对象上存在才能让 Vue 转换它,这样才能让它是响应的。

    解决办法

    若是对象,建议在data中定义好所有的属性
    若是数组,最好重新赋值,不要单独修改某个元素

    如果数据变更后需要强制刷新界面,vue提供 this.$forceUpdate() 方法

    注意事项

    在给对象赋值时一定要保证新的对象拥有其所有响应的属性,否则修改到非响应属性时也会造成页面不重新渲染。


    原文:https://blog.csdn.net/u011628981/article/details/83587935

    展开全文
  • 修改对象属性的方法

    2019-09-23 23:36:22
    为了修改属性性,使用上一页中介绍的如果对象不具备你打算修改属性,技术为对象添加属性,赋予一个新值。则会将其添加到对象上。 方法一: 方法二: 也可以用方括号语法来更新对象的属属性的新值在等号的...
  • CAD修改对象属性

    2019-07-09 15:48:00
    所有对象都一个唯一的标识id和句柄,都是用来标识对象,知道对象的Id或句柄,就能找到对象修改属性。id是只在当前内存中唯一,下次再打开id就会发生变化,句柄会随图纸保存,并会一直不变。 对象Id,指针,句柄...
  • 如果要直接修改对象属性序列化后的属性键,并且应用到序列化过程与反序列化过程,则应该使用JsonProperty属性 2.实体 import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; import ...
  • 当我this.$set修改对象属性竟然没有引发更新的时候我是崩溃的,我甚至开始怀疑起这个代码、这个编辑器甚至这个浏览器在针对我_(:з」∠)_ 最终原因是初始对象中没有这个属性时,我直接用 obj.attr= []; 新增了一...
  • 通过反射修改对象属性

    千次阅读 2020-06-29 11:12:59
    public static void main(String[] args) throws Exception {... * 通过反射调取方法修改参数,应用场景比较多 */ //获取反射对象 Class<?> name = Class.forName(str); //获取实例,因为newInstance方法得到
  • JS修改对象属性的值

    千次阅读 2020-09-18 10:06:07
    当对象以数字为属性名时,其实就是一个数组,用[’’] var foo={1:'a',2:'b'} foo['1']='c' console.log(foo) // { 1: "c", 2: "b" } 当对象以字符为属性名时,直接用.获取属性值 ...可以存取对象属性值。
  • 利用反射,通过类属性名称,修改属性的值。 2 修改属性值 2.1 实体类 package com.company.designpattern.reflect; import java.util.Objects; /** * 测试类,用于反射测试 * @author xindaqi * @since ...
  • vue 修改对象属性 页面不重新渲染

    千次阅读 2018-10-31 17:44:43
    Vue 不能检测到对象属性的添加或删除。由于 Vue 会在初始化实例时对属性执行 getter/setter 转化过程,所以属性必须在 data 对象上存在才能让 Vue 转换它,这样才能让它是响应的。 注意事项 在给对象赋值时一定要...
  • 修改对象属性值 List<LibraryDO> lib = list.stream().map(p -> {p.setId(p.getId() + 1);return p;}).collect(Collectors.toList()) /** * LibraryDO 对象 */ public class LibraryDO implements Serializable { /...
  • 【vue】vue修改对象属性

    千次阅读 2020-06-22 13:38:44
    前言 修改对象属性 this.$set(this.data, "key", value) 删除对象属性 this.$delete(this.data, "key") 修改数组属性 this.$set(this.data, index, value) 删除数组属性 this.$delete(this.data, index)
  • 添加自定义属性时应该这样: this.$set(this.tableData[index],'...我想在this.tableData[index]这个对象添加color属性,值为primary 修改时应该这样; this.$set(this.tableData[index],'color','warning'); ...
  • frida修改对象属性(变量)

    千次阅读 2019-05-19 21:44:43
    import frida, sys jscode = """ Java.perform(function () { var utils = Java.use('com.xiaojianbang.app.Utils'); var money = Java.use('com.xiaojianbang.app.Money'); var clazz = Java.use('j...
  • vue修改对象属性后页面不重新渲染

    千次阅读 2018-09-06 19:55:55
    &lt;el-form-item v-for="(repairWorker, index) in ruleForm.repairWorkers" :label="'车牌号' + (index+1)" :key="repairWorker.id" :prop="... ...
  • var data = { a: 1 } var vm = new Vue({ data: data }) vm.$data.a = 22; 输出的vm的属性值被改变了,但是视图内容未改变,添加 vm.$forceUpdate();
  • 文章目录 前言 Object.defineProperty() Proxy Proxy校验器 ...虽然Object.defineProperty()和proxy都能实现对象属性的自定义,但是proxy作为es6新出现的特性,它的功能比defineProperty 更加丰富使用起来也更加灵活。
  • function renameProperties(sourceObj, replaceList, destObj) { destObj = destObj || {}; // for each property in source object $.each(sourceObj, function(key) { // if the p...
  • 参数说明如下: object:指定要添加或修改属性对象,可以是 JavaScript 对象或者 DOM 对象。 propertyname:表示属性名的字符串。 descriptor:定义属性的描述符,包括对数据属性或访问器属性。 Object....
  • 需要注意的是,使用defineProperty来创建属性,configurable 特性默认为false,所以在创建x属性时必须要加上configurable: true,否则就会报错: 哪怕是用defineProperty去修改configurable也是不行的: ...
  • 我的需求是想把arr1和arr2添加到resultArr 中,并且给arr2分别添加index属性为arr1的idnex值。代码如下: const arr1 = [{ id: 1, name: 'a', index: 0 }, { id: 2, name: 'b', index: 1 }]; const arr2 = [{ id: 3,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,417
精华内容 8,566
关键字:

修改对象属性