文章目录
前言
对象为一组属性的无序集合。严格来说,这意味着对象就是一组没有特定顺序的值。对象的每一个属性或方法都由一个名称来标识,这个名称映射到一个值。
一、创建对象
1、字面量创建(无法实现代码复用,但很便捷)
const obj = {
name: 'jack',
age: 20,
sex : '男'
}
2、工厂模式
//工厂函数
function createPerson(name, age, sex) {
let o = new Object();
o.name = name;
o.age = age;
o.sex = sex;
o.sayName = function () {
console.log(this.name);
}
return o;
}
let o1 = createPerson('jack', 20, '男');
let o2 = createPerson('Tom', 21, '男');
这种工厂模式虽然可以解决创建多个类似对象的问题,但没有解决对象标识的问题(即新创建的对象是什么类型)。
3、构造函数模式
//构造函数
function Person(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
this.sayName = function () {
console.log(this.name);
}
}
let obj1 = new Person('jack', 20, '男');
let obj2 = new Person('Tom', 21, '男');
1、new操作符。以这种方式调用构造函数会执行以下操作。
(1)、在内存中创建一个新对象。
(2)、新对象内部的–proto–特性被赋值为构造函数的prototype属性。
(3)、构造函数内部的this属性被赋值为这个新对象(即this指向新对象)。
(4)、执行构造函数内部的代码(给新对象添加属性)。
(5)、若构造函数返回非空对象,则返回该对象,否则返回刚创建的新对象。
2、构造函数的问题
构造函数定义的方法会在每个实例上都创建一遍。
二、理解对象
1、对象属性的类型
对象的属性名称可以是:字符串,数字,符号(symbol)。
属性分两种:数据属性和访问器属性。
(1)、数据属性
[[Configurable]]:表示属性是否可以通过delete删除并重新定义,是否可以修改他的特性,以及是否可以把它改为访问器属性。
[[Enumerable]]:表示是否可以通过for-in循环返回。
[[Writable]]:表示属性的值是否可以被修改。
[[value]]:包含属性的值。
let obj = {name:‘tom’,age:‘18’};像这样属性显示添加到对象之后,数据属性都会被设置为true。
//字面量创建
const obj = {
name: 'jack',
age: 20,
sex: '男'
};
console.log(Object.getOwnPropertyDescriptors(obj));
/* age: {value: 20, writable: true, enumerable: true, configurable: true}
name: {value: 'jack', writable: true, enumerable: true, configurable: true}
sex: {value: '男', writable: true, enumerable: true, configurable: true}
*/
const obj2 = {};
obj2.name = 'tom';
console.log(Object.getOwnPropertyDescriptors(obj2));
// name:{ value: 'tom', writable: true, enumerable: true, configurable: true }
Object.defineProperty的方法可以修改属性的默认特性。
const obj3 = {};
Object.defineProperties(obj3, {
name: {
value: 'kangkang',
},
age: {
value: 18,
configurable: true,
enumerable: true
}
})
console.log(Object.getOwnPropertyDescriptors(obj3));
/*
age: {value: 18, writable: false, enumerable: false, configurable: true}
name: {value: 'kangkang', writable: false, enumerable: false, configurable: false}
*/
(2)、访问器属性
[[Configurable]]:表示属性是否可以通过delete删除并重新定义,是否可以修改他的特性,以及是否可以把它改为访问器属性。
[[Enumerable]]:表示是否可以通过for-in循环返回。
[[Get]]:获取函数,在读取属性时使用。
[[Set]]:设置函数,在写入属性时调用。
let book = {
year_ : 2017,
edition:1
};
Object.defineProperty(book,'year',{
get(){
console.log('获取函数');
return this.year_
},
set(newValue){
this.year_ = newValue;
}
})
2、设置属性和读取属性的特性
代码如下(示例):
//设置属性
let book = {};
Object.defineProperty(book,'year',{
value: 2017,
enumerable:true,
configurable:true,
writable:true
})
let book = {};
Object.defineProperty(book, 'year', {
value: 2017,
enumerable: true,
configurable: true,
writable: true
})
Object.defineProperties(book, {
name: {
value: '三国',
},
color: {
value: 'white',
enumerable: true,
configurable: true,
writable: true
}
})
//读取属性的特性
// Object.getOwnPropertyDescriptor()
console.log(Object.getOwnPropertyDescriptor(book,'year'));
// {value: 2017, writable: true, enumerable: true, configurable: true}
console.log(Object.getOwnPropertyDescriptor(book,'name'));
// {value: '三国', writable: false, enumerable: false, configurable: false}
//Object.getOwnPropertyDescriptors()
console.log(Object.getOwnPropertyDescriptors(book));
/* {
color: {value: 'white', writable: true, enumerable: true, configurable: true}
name: {value: '三国', writable: false, enumerable: false, configurable: false}
year: {value: 2017, writable: true, enumerable: true, configurable: true}
}
*/
2、如何判断一个变量是一个对象。
//如何判断一个变量是一个对象
let obj4 = {}
Object.prototype.toString(obj4)//[object Object] 推荐使用这个,最准确
obj4.constructor === Object; //true
obj4 instanceof Object ; //true