1.对象直接量
var obj = {
name: 'xiaoming',
age: 20
};
2.关键字new
var obj = new Object();
3.Object.create函数
var obj = Object.create(Object.prototype);
实现原理:
/*
*@params {object} p
@returns {object}
*/
var _create (p) {
function f() {};
f.prototype = p; //将原型指向传进来的对象
return new f();
}
可以通过".“或者”[]“进行设置和访问;
如果属性是关键字、保留字、包含着”-",“ ”(空白字符串),或者是接收一个属性是变量的情况,需要使用"[]"进行操作对象;
var obj = {
"main title": "This is my name",
"for": 1,
"main-title: "This is title",
"class": 2
};
obj[xxx]; //以上等情况都是使用[]进行访问
访问对象属性(重点)
访问一个对象的属性,会先从对象的“自有属性”开始查找,如果找到,就往对象的原型上查找,如果没有则一直往上查找直至**‘Object.prototype.__ proto __’**(null)。如果查找的过程找到,则返回对应的值。没有的话,则返回undefined。
1.如果属性是原型上继承而来且同时是只读属性,则只能读取该属性的值而不是给其赋值。
2.如果属性不是对象的自有属性,同时该对象继承的原型对象上有该属性,且该属性的修改符writable为true,且同时定义了setter函数,那么给该属性赋值的时候调用了setter函数
//上述规则1
var obj = {};
Object.defineProperty(obj, a, {
value: 1,
writable: false, //false为只读,true为可读写
configurable: false,//false为不可删除或重新修改属性的描述符,true可删除或重新定义该属性
enumerable: false, //false为不可枚举,true为可枚举
});
var myObj = Object.create(obj);
myObj.a = 100; //无效,该属性为原型上且writable为false,只能对其进行访问
myObj.a; // 1
//上述规则2
var obj = {
x: 1,
y: 2
};
var value = 1;
Object.defineProperty(obj, 'z', {
set: function (val) {
console.log(`set value to ${val}`);
value = val;
},
get: function () {
console.log(`get value is ${value}`);
return value;
}
});
var childObj = Object.create(obj);
childObj.a = 100; ///调用的是继承对象的setter属性
delete操作符只能删除对象的自有属性而不能删除继承属性。
delete删除成功或者删除不存在的属性会返回true。
delete删除不可配置(configurable)为false的属性,返回false。严格模式直接抛出错误。
运算符有以下这些:
in 操作符
检测对象所有自有属性和继承属性,存在为true
hasOwnProperty 操作符
检测对象所有自有属性,存在为true
propertyIsEumerable 操作符
检测对象所有不可枚举自有属性,存在为true
for/in
遍历对象所有可枚举的自有属性和继承属性
Object.keys()
获取对象所有可枚举的自有属性
Object.getOwnPropertyNames()
获取对象所有自有属性
如果某个属性只存在getter,那该属性就是只读属性;如果某个属性只存在setter,那该属性就是只写属性;同时存在的
var obj = {
x: 1,
y: 2,
get r () {
return this.x + this.y;
},
set r (val) {
this.x = val / 2;
this.y = val / 3;
}
};
等价于:
var obj = {
x: 1,
y: 2
};
Object.defineProperty(obj, 'z', {
get () {
return this.x + this.y;
},
set (val) {
this.x = val / 2;
this.y = val / 3;
}
});
对象属性分为两种:数据属性和存取器属性,属性具有属性描述符,也就是下面列举的这些。
数据属性描述符:
value 值
enumerable 可枚举的
configurable 可配置的
writable 可写的
存取器属性描述符:
set 写入
get 读取
enumerable 可枚举的
configurable 可配置的
Object.getOwnPropertyDescriptor(obj,key);
只能获取自有属性的属性描述符
Object.getPropertyOf(obj);
获取对象的原型对象
Object.defineProperty(Obj, key, descriptor);
定义对象某个属性,新创建的属性默认属性描述符的特性为false或者undefined
Object.defineProperties(obj, {多个属性描述符});
定义对象多个属性
获取原型对象
ES5: Object.getPropertyOf()
ES3: obj.constructor.prototype
检测一个对象是否为另外一个对象的原型
p.isPropertyOf(o) //检测p是否为o的原型
instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上
例子:
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
const auto = new Car('Honda', 'Accord', 1998);
console.log(Car.prototype.isPrototypeOf(auto)); //true
console.log(auto instanceof Car); //true
Object.prototype.toString.call(o).slice(8, -1); //返回类属性
对象的可扩展性是表示能否给对象添加新属性。
Object.esExtensible(); // 查询对象是否可扩展
Object.preventExtensions(); //将对象转换为不可扩展,但是属性还是可配置的
Object.seal(); //将对象转换为不可扩展,而且对象的自有属性也是不可配置的,属性的读写属性依然有效
Object.freeze(); //将对象转换为不可扩展,而且对象的自有属性变为只读属性
JSON.stringify()将对象转换为字符串;
JSON.parse()将对字符串转换为对象;
NaN,Infinity, -Infinity转换为字符串都变成null
函数、RegExp、Error对象和undefined不能被序列化和还原
只序列化对象的自有属性