介绍
在 JavaScript 中,几乎“所有事物”都是对象,即万物皆对象。所有JavaScript除了原始值都是对象。
- 布尔值是对象(new 定义)
- 数字是对象(new 定义)
- 字符串是对象(new 定义)
- 日期是对象是对象
- 正则表达式是对象
- 算术是对象
- 数组是对象
- 函数是对象
- 对象永远是对象
JavaScript原始值
- string
- number
- boolean
- null
- undefined
对象是包含变量的变量
对象也是变量。但是对象能够包含很多值。 格式: 键(名称): 值
var obj = {
name: '张三',
age: 18
}
命名的值(键、名称)被称为属性
创建对象
字面量创建
使用对象文字,您可以在一条语句中定义和创建对象。
对象文字指的是花括号 {} 中的名称:值对。
var obj = {
name: '张三',
age: 18
}
console.log(typeof obj) // object
关键词 new 创建
var obj = new Object()
obj.name = '张三'
obj.age = 18
console.log(obj) // {name: "张三", age: 18}
对象是易变的
var obj = {
name: '张三',
age: 18
}
var b = obj
b.name = '李四'
console.log(b.name) // 李四
console.log(obj.name) // 李四
解决方法:
- 对象:assign
- 数组:slice
- 使用
...赋值新变量, 数组对象皆可 - JSON.parse(JSON.stringify(obj))
var obj = { name: '张三', age: 18 }
var b = Object.assign( {}, obj)
b.name = '李四'
console.log(b.name)
console.log(obj.name)
属性
属性指的是与 JavaScript 对象相关的值。可以被修改、删除、添加。
访问属性
var obj = { name: '张三', age: 18 }
// 1、obj.property
obj.name
// 2、obj["property"]
obj['name']
遍历对象的属性
for...in 遍历对象属性。
var obj = { name: '张三', age: 18 }
for (var key in obj) {
console.log(key, obj[key])
}
添加属性
var obj = { name: '张三', age: 18 }
obj.sex = '男'
obj['phone'] = '125245'
console.log(obj) // {name: "张三", age: 18, sex: "男", phone: "125245"}
删除属性
delete 删除对象属性。
delete 关键词不会删除被继承的属性,但是如果您删除了某个原型属性,则将影响到所有从原型继承的对象。
var obj = { name: '张三', age: 18 }
delete obj.name
console.log(obj) // {age: 18}
对象方法
JavaScript 方法是能够在对象上执行的动作。
this 关键词
this 指的是拥有该 JavaScript 代码的对象。
在函数中使用时,this 是“拥有”该函数的对象。
this 是关键词,不是变量,无法改变this的值。
访问对象方法
var obj = { name: '张三', age: 18, fnc: function() {console.log(this.name)} }
// object.methodName()
obj.fnc() // 张三
其他方法
// 添加或更改对象属性
Object.defineProperty(object, property, descriptor)
// 添加或更改多个对象属性
Object.defineProperties(object, descriptors)
// 访问属性
Object.getOwnPropertyDescriptor(object, property)
// 以数组返回所有属性
Object.getOwnPropertyNames(object)
// 以数组返回所有可枚举的属性
Object.keys(object)
// 访问原型
Object.getPrototypeOf(object)
// 阻止向对象添加属性
Object.preventExtensions(object)
// 如果可将属性添加到对象,则返回 true
Object.isExtensible(object)
// 防止更改对象属性(而不是值)
Object.seal(object)
// 如果对象被密封,则返回 true
Object.isSealed(object)
// 防止对对象进行任何更改
Object.freeze(object)
// 如果对象被冻结,则返回 true
Object.isFrozen(object)
属性元数据
writable : true // 属性值可修改
enumerable : true // 属性可枚举
configurable : true // 属性可重新配置
对象访问器
Getter 和 Setter 允许您定义对象访问器(被计算的属性)。
Getter (get关键词)
var obj = { name: '张三', age: 18 }
// 使用 getter 来赋值来自对象的数据
var b = obj.name
console.log(b) // 张三
Setter (set关键词)
var obj = { name: '张三', age: 18, sex: '' }
// 使用 setter 来设置对象属性的值
obj.sex = '女'
console.log(obj) // {name: "张三", age: 18, sex: "女"}
函数中的 get 和 set
var obj = {
name: '张三',
age: 18,
sex: '',
get getName() {
console.log('它的名字是:' + this.name)
return '它的名字是:' + this.name
},
set setSex(sex) {
this.sex = sex
console.log(this.sex)
}
}
obj.setSex = 20 // 20
obj.getName() // 它的名字是:张三
defineProperty
Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。
三个参数:要定义属性的对象、要定义或修改的属性的名称、要定义或修改的属性的内容。
var obj = {name: '张三', sex: ''}
Object.defineProperty(obj, 'setSex', {
set: function(val) {
this.sex = val
}
})
Object.defineProperty(obj, 'getName', {
get: function() {
console.log('name:' + this.name)
}
})
obj.setSex = '男'
console.log(obj) // {name: "张三", sex: "男"}
obj.getName // name:张三
getOwnPropertyDescriptor
Object.getOwnPropertyDescriptor() 方法返回指定对象上一个自有属性对应的属性描述符。
两个参数:需查找的对象、需查找对象的属性。
返回值:
- value: 该属性的值
- writable: 当且仅当属性的值可以被改变时为true
- get: 获取该属性的访问器函数(getter)
- set: 获取该属性的设置器函数(setter)
- enumerable: 当且仅当指定对象的属性描述可以被改变或者属性可被删除时,为true。
- configurable: 当且仅当指定对象的属性可以被枚举出时,为
true。
var obj = {name: '张三', sex: '男'}
var desc = Object.getOwnPropertyDescriptor(obj, 'name')
console.log(desc) // {value: "张三", writable: true, enumerable: true, configurable: true}
console.log(desc.value) // 张三
对象构造器
创建一种“对象类型”的方法,是使用对象构造器函数。
通过 new 关键词调用构造器函数可以创建相同类型的对象。
function Person (name, age, sex) {
this.name = name
this.age = age
this.sex = sex
}
var p1 = new Person('A', 15, '女')
console.log(p1) // Person {name: "A", age: 15, sex: "女"}
this指向
this 的值,在对象使用时,就是对象本身。
在构造函数中,this 是没有值的。他是新对象的替代物。当新对象被创建时,它就指向新对象。
function Person (name, age, sex) {
this.name = name
this.age = age
this.sex = sex
console.log(this)
this.getName = function() {
console.log('name:' + this.name)
}
}
var p1 = new Person('A', 15, '女')
console.log(p1) // Person {name: "A", age: 15, sex: "女"}
p1.setSex = function(sex) {
this.sex = sex
console.log(this.sex)
}
p1.setSex('男')
p1.getName()