JavaScript权威指南之对象

创建对象

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属性

如果某个属性只存在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不能被序列化和还原
只序列化对象的自有属性

你可能感兴趣的:(JavaScript)