首页 > 专栏 > 前端 > 文章详情
js 对象中默认的数据属性和访问器属性理解 发布于:2021-03-07 10:54:19   原创发表   查看:3  讨论:0
新建对象最原始的方法:
var obj = new Object();// == var obj = {}QS3易塔云建站-模板下载,web开发资源,技术博客
obj.name = "red";QS3易塔云建站-模板下载,web开发资源,技术博客
obj.job = "Software Engineer";QS3易塔云建站-模板下载,web开发资源,技术博客
obj.sayHey = function(){QS3易塔云建站-模板下载,web开发资源,技术博客
    alert("大家好,我的名字是:" + this.name + "!");QS3易塔云建站-模板下载,web开发资源,技术博客
}QS3易塔云建站-模板下载,web开发资源,技术博客
console.log(obj);QS3易塔云建站-模板下载,web开发资源,技术博客
obj.sayHey();
后来演变为对象字面量形式:
var obj = {QS3易塔云建站-模板下载,web开发资源,技术博客
    name : "blue",QS3易塔云建站-模板下载,web开发资源,技术博客
    job  : "Software Engineer",QS3易塔云建站-模板下载,web开发资源,技术博客
    sayHey : function(){QS3易塔云建站-模板下载,web开发资源,技术博客
        alert("大家好,我的名字是:" + this.name + "!");QS3易塔云建站-模板下载,web开发资源,技术博客
    }QS3易塔云建站-模板下载,web开发资源,技术博客
}QS3易塔云建站-模板下载,web开发资源,技术博客
obj.sayHey();QS3易塔云建站-模板下载,web开发资源,技术博客
console.log(obj);
js规定一些特性是为了实现JavaScript引擎用的。QS3易塔云建站-模板下载,web开发资源,技术博客
上面的[[Configurable]] [[Enumerable]] [[Writable]] [[value]]四个数据属性(前三),都将被默认设置为了true,QS3易塔云建站-模板下载,web开发资源,技术博客
而[[value]]特性被设置为指定的值。QS3易塔云建站-模板下载,web开发资源,技术博客
修改默认数据属性特性的值,必须使用 Object.defineProperty()。QS3易塔云建站-模板下载,web开发资源,技术博客
语法:Object.defineProperty(要修改哪个obj,要修改哪个属性,描述符对象[1-3个描述符+value])。
var person = {};QS3易塔云建站-模板下载,web开发资源,技术博客
Object.defineProperty(person, "job", {QS3易塔云建站-模板下载,web开发资源,技术博客
    writable : false,//Writable:是否可写。false:只读QS3易塔云建站-模板下载,web开发资源,技术博客
    // configurable : true,//configurable:是否可删。false:不可删除。QS3易塔云建站-模板下载,web开发资源,技术博客
    enumerable : true, //是否可枚举 for-inQS3易塔云建站-模板下载,web开发资源,技术博客
    value : "Soft Engineer"QS3易塔云建站-模板下载,web开发资源,技术博客
})QS3易塔云建站-模板下载,web开发资源,技术博客
//是否可写QS3易塔云建站-模板下载,web开发资源,技术博客
alert(person.job)QS3易塔云建站-模板下载,web开发资源,技术博客
person.job = "aaaa"QS3易塔云建站-模板下载,web开发资源,技术博客
alert(person.job)//also hahahahQS3易塔云建站-模板下载,web开发资源,技术博客
//是否可删QS3易塔云建站-模板下载,web开发资源,技术博客
delete person.job;QS3易塔云建站-模板下载,web开发资源,技术博客
alert(person.job)QS3易塔云建站-模板下载,web开发资源,技术博客
//for in 循环 是否可以返回属性QS3易塔云建站-模板下载,web开发资源,技术博客
for(var i in person){QS3易塔云建站-模板下载,web开发资源,技术博客
    console.log(person[i])QS3易塔云建站-模板下载,web开发资源,技术博客
}
访问器属性:访问某个对象中,某个数据属性。
var book = {QS3易塔云建站-模板下载,web开发资源,技术博客
    _year : 2004,QS3易塔云建站-模板下载,web开发资源,技术博客
    edition: 1QS3易塔云建站-模板下载,web开发资源,技术博客
}QS3易塔云建站-模板下载,web开发资源,技术博客
Object.defineProperty(book,"year",{//year属性并未使用在对象方法内部QS3易塔云建站-模板下载,web开发资源,技术博客
    get : function(){QS3易塔云建站-模板下载,web开发资源,技术博客
        return this._year;//在对象方法内部-数据属性,常用标记前缀_QS3易塔云建站-模板下载,web开发资源,技术博客
    },QS3易塔云建站-模板下载,web开发资源,技术博客
    set : function(newValue){QS3易塔云建站-模板下载,web开发资源,技术博客
        if(newValue > 2014){QS3易塔云建站-模板下载,web开发资源,技术博客
            this._year = newValue;QS3易塔云建站-模板下载,web开发资源,技术博客
            this.edition = newValue - 2004QS3易塔云建站-模板下载,web开发资源,技术博客
        }QS3易塔云建站-模板下载,web开发资源,技术博客
    }QS3易塔云建站-模板下载,web开发资源,技术博客
});QS3易塔云建站-模板下载,web开发资源,技术博客
book.year = 2015;//在外部调用year属性,都不变QS3易塔云建站-模板下载,web开发资源,技术博客
console.log(book.edition)
一次定义多个属性:
var book = new Object();QS3易塔云建站-模板下载,web开发资源,技术博客
Object.defineProperties(book,{QS3易塔云建站-模板下载,web开发资源,技术博客
    _year : {//一个数据属性QS3易塔云建站-模板下载,web开发资源,技术博客
        writable : true,QS3易塔云建站-模板下载,web开发资源,技术博客
        value : 2004QS3易塔云建站-模板下载,web开发资源,技术博客
    },QS3易塔云建站-模板下载,web开发资源,技术博客
    edition : {//一个数据属性QS3易塔云建站-模板下载,web开发资源,技术博客
        writable : true,QS3易塔云建站-模板下载,web开发资源,技术博客
        value : 2QS3易塔云建站-模板下载,web开发资源,技术博客
    },QS3易塔云建站-模板下载,web开发资源,技术博客
    year : {//一个访问器属性,访问数据属性 _yearQS3易塔云建站-模板下载,web开发资源,技术博客
        get : function(){QS3易塔云建站-模板下载,web开发资源,技术博客
            return this._year;QS3易塔云建站-模板下载,web开发资源,技术博客
        },QS3易塔云建站-模板下载,web开发资源,技术博客
        set : function(newValue){QS3易塔云建站-模板下载,web开发资源,技术博客
            if(newValue > 2004){QS3易塔云建站-模板下载,web开发资源,技术博客
                this._year = newValue;QS3易塔云建站-模板下载,web开发资源,技术博客
                this.edition += newValue - 2004;QS3易塔云建站-模板下载,web开发资源,技术博客
            }QS3易塔云建站-模板下载,web开发资源,技术博客
        }QS3易塔云建站-模板下载,web开发资源,技术博客
    }QS3易塔云建站-模板下载,web开发资源,技术博客
});QS3易塔云建站-模板下载,web开发资源,技术博客
book.year = 2008;
读取属性的特性:getOwnPropertyDescriptor(obj,"属性")
/*返回一个对象:*/QS3易塔云建站-模板下载,web开发资源,技术博客
var descriptor1 = Object.getOwnPropertyDescriptor(book,"year");QS3易塔云建站-模板下载,web开发资源,技术博客
console.log(descriptor1);//year是一个访问器属性QS3易塔云建站-模板下载,web开发资源,技术博客
console.log(descriptor1.configurable);//falseQS3易塔云建站-模板下载,web开发资源,技术博客
var descriptor2 = Object.getOwnPropertyDescriptor(book,"_year");QS3易塔云建站-模板下载,web开发资源,技术博客
console.log(descriptor2);//_year是一个数据属性QS3易塔云建站-模板下载,web开发资源,技术博客
console.log(descriptor2.value);//2008QS3易塔云建站-模板下载,web开发资源,技术博客
var descriptor3 = Object.getOwnPropertyDescriptor(book,"edition");QS3易塔云建站-模板下载,web开发资源,技术博客
console.log(descriptor3.value);//6

评论

  • 匿名