JavaScript-面向对象编程
理解对象
对象是一组没有特定顺序的值。对象的每个属性或者方法都有一个名字,而每个名字都映射到一个值。每个对象都是基于一个引用类型创建的。
var person ={
// 属性名:属性值,
name:"Jinag Liangji",
age:25,
job:"Software Engineer",
sayName: function (){
print("hello,my name is "+ this.name+"!")
}
}
属性类型
数据属性
数据属性包含一个数据值的位置,在这个位置可以读取和写入值。数据属性有4个描述其行为的特性:
- [[Configurable]]:表示能否通过delete删除属性从而重新定义属性、能否修改属性的特性、能否把属性改成访问器属性
- [[Enumerable]]:表示能否通过for-in循环返回属性
- [[Writable]]:表示能否修改属性的值
- [[Value]]:包含这个属性的数据值
比如name:“Jiang Liangji”:即name这个属性的[[Value]]的特性被设置为"Jinag Liangji",对这个值的任何修改都反映在name的位置
访问器属性
访问器属性不包含数据值,它们是一对getter和setter函数。
在读书访问器属性是,调用getter函数,这个函数负责返回有效的值;
在写入访问器属性时,会调用setter函数并传入新值,这个函数负责决定如何处理数据。
有4个描述其行为的特性:
- [[Configurable]]:表示能否通过delete删除属性从而重新定义属性、能否修改属性的特性、能否把属性改成为数据属性
- [[Enumerable]]:表示能否通过for-in循环返回属性
- [[get]]:在读取属性时调用的函数,默认为undefined
- [[set]]:在写入属性时调用的函数,默认为undefined
var book = {
_year:2019, //year前面的下划线_表示只能通过对象方法访问的属性
edition: 1
};
Object.defineProperty(book,'year',{
get:function () {
return this._year;
},
set:function (newValue) {
if (newValue > 2019){
this._year = newValue;
this.edition += newValue-2019
}
}
})
book.year= 2021
console.log(book.edition) //输出结果为3
创建对象的方法
//字面量语法
var obj1 = {
name:"对象一",
age:31,
speak: function () {
console.log('hi')
}
}
//创建对象,再设置属性
var obj3 = new Object() //"Object"构造器创建了一个针对特殊值的对象包装,只不过这里没有传值给它,所以它将会返回一个空对象
//设置属性
obj3.name="张三"
obj3.age=23
obj3.sayName = function () {
console.log(this.name)
}