您的位置:首页 > Web前端 > JavaScript

Javascript高级程序设计——面向对象之理解对象

2015-09-03 13:36 621 查看
在面向对象语言中都有类的概念,通过类来创建具有属性和方法的对象。而ECMAScript中没有类的概念,ECMAScript中定义了对象:无需属性的集合,其属性值可以包含基本值、对象、或者函数。

在Javascript中每个对象都是基础引用类型来创建的,可以是原生类型也可以是自定义的类型。

自定义对象最简单的方法就是通过创建Object类型的实例,然后为这个实例添加属性和方法。

var Person = new Object();

Person.name = "yangxunwu";

Person.age = 24;

Person.sayName = function(){

alert(this.name);

};

我们这里创建了一个object类型的一个名为Person的对象,有两个属性name和age,一个方法sayName;

属性类型:

对象拥有属性,这些属性也有一些特性,比如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引擎用的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: