JS面向对象之对象的属性

1.属性的设置和获取

通过 . 操作符或者[ ]
区别:. 操作符取自身的属性,[ ]可以是变量

var o = {};
o.name = "缘灭";
var aaa = "name";
console.log(o[aaa]);//缘灭

ps:一道比较坑的笔试题

var str = "abc";
str += 1;
var test = typeof(str);
if(test.length == 6){
    test.sign = "hahaha"//test不是对象,赋值是没有效果的
}
console.log(test.sign);//undefined

2.属性的删除

delete命令用于删除对象的属性,删除成功后返回true。删不掉原型上的
注意:删除一个不存在的属性,delete不报错,而且返回true。因此,不能根据delete命令的结果,认定某个属性是存在的。

var obj = { p: 1 };
delete obj.p // true
obj.p // undefined

3.属性的检测

in 或者 hasOwnProperty()方法

var o = {};
o.name = "缘灭";
console.log("name" in o);//true
console.log(o.hasOwnProperty("name"));//true

4.属性的枚举

for…in循环用来遍历一个对象的全部属性。包括原型上的属性,而且顺序是不确定的

var obj = {a: 1, b: 2, c: 3};
for (var i in obj) {
  console.log('键名:', i);//a b c
  console.log('键值:', obj[i]);//1 2 3
}

查看一个对象本身的所有属性,也可以使用Object.keys方法。

var obj = {
  key1: 1,
  key2: 2
};
Object.keys(obj);// ['key1', 'key2']
}

5.ES中有两种属性:数据属性和访问器属性

数据属性:
[[Configurable]]:表示能否通过delete删除属性,默认true
[[Enumerable]]:表示能否通过for-in循环返回属性,默认true
[[Writable]]:表示能否修改属性的值,默认true
[[Value]]:包含这个属性的数据值,默认undefined

修改默认属性特性:Object.defineProperty(属性所在的对象,属性名,描述符对象)
var person = {};
Object.defineProperty(person, "name", {
    writable: false,     //只读,不允许修改
    value: "Nicholas"
});
alert(person.name);//Nicholas
person.name = "Michael”;  //修改不成功,严格模式下会报错
alert(person.name);//Nicholas

注意:一旦把属性定义为不可配置,就不能再把他变回可配置了。此时再调用除writable之外的特性都会报错。

访问器属性:
[[Configurable]]:表示能否通过delete删除属性,默认true
[[Enumerable]]:表示能否通过for-in循环返回属性,默认true
[[Get]]:读取属性时调用的函数,默认undefined
[[Set]]:写入属性时调用的函数,默认undefined

必须使用 Object.defineProperty(属性所在的对象,属性名,描述符对象) 定义访问器属性
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 = 2006;
alert(book.edition); //3

猜你喜欢

转载自blog.csdn.net/weixin_36302575/article/details/85233309