在面向对象语言中都有类的概念,经过类来建立具备属性和方法的对象。而ECMAScript中没有类的概念,ECMAScript中定义了对象:无需属性的集合,其属性值能够包含基本值、对象、或者函数。 javascript
在Javascript中每一个对象都是基础引用类型来建立的,能够是原生类型也能够是自定义的类型。 java
自定义对象最简单的方法就是经过建立Object类型的实例,而后为这个实例添加属性和方法。 浏览器
var Person = new Object(); 函数
Person.name = "yangxunwu"; this
Person.age = 24; spa
Person.sayName = function(){ 对象
alert(this.name); ip
}; 字符串
咱们这里建立了一个object类型的一个名为Person的对象,有两个属性name和age,一个方法sayName; get
属性类型:
对象拥有属性,这些属性也有一些特性,好比Configurable、Enumerable、Writable、Value。在javascript不能直接访问这些特性,需经过对象的方法访问,好比Object.defineProperty()
数据属性:数据属性包含这个数据值的位置,在这个位置能够读取和写入值。数据属性有四个特性:
Configurable:可否经过delete删除属性从而从新定义属性,可否修改属性的特性,可否把属性修改成访问器属性。
Enumerable:可否经过for-in循环返回属性。
Writable:可否修改属性值。
Value:保持这个属性的数据值。
var Person = {
name: "yangxunwu",
}
Object.defineProperty(Person, "age", {
writable: false,
value: 24
})
定义一个Person对象,并设置一个不可写的值为24的age属性。注意定义属性时的属性字符串形式。当把属性的configurable特性设置为false时,没法在次修改,只能使用writable。
访问器属性: 访问器属性不包含值,包含一对getter和setter函数,访问访问器属性时调用getter函数,这个函数返回有效的值,写入访问器属性时调用setter函数,并传入新值。访问器属性包含四个特性:
Configurable:可否经过delete删除属性从而从新定义属性,可否修改属性的特性,可否把属性修改成数据属性。
Enumerable:可否经过for-in循环返回属性。
Get:读取数据时调用的函数。默认undefined
Set:写入属性时调用的函数。默认undefined
var Person = {
_year : 1992,
age : 0
}
Object.defineProperty(Person, "year", {
get: function(){
return this._year;
},
set: function(newValue){
if(newValue > 1992){
this._year = newValue;
this.age = newValue - 1992;
}
}
})
给Person对象,定义了一个访问器属性year,访问时返回对象的__year属性,赋值时会调用set函数,而后同时设置age的值。
部分浏览器也能够经过_defineGetter__和 __defineSetter__来设置访问器特性。也能够设置多个特性Object.defineProperties()。要读取一个属性的特性,能够经过给定属性的描述符。
Object.getOwnPropertyDescriptor()方法,返回一个对象,包含各类特性的属性,能够针对BOM和DOM对象来使用。
ECMAScript定义这些特性的目的是为了实现Javascript引擎用的