面向对象的程序设计

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象的程序设计相关的知识,希望对你有一定的参考价值。

一、理解对象

var person = new Object();
person.name = "Nicholas";
person.age= 29;
person.job = "Software Engineer";

person.sayName = function(){
alert(this.name);
};

名为person的对象,并未它天街了三个属性和一个方法。用字面量语法可以写成这样:

var person ={
     name : "Nicholas";
     age: 29;
     job : "Software Engineer";

    sayName : function(){
         alert(this.name);
    }
};

二、属性类型

1、数据属性

数据属性包含一个数据值的位置。在这个位置可以读取和写入值。数据属性有4个描述其行为的特性。

■ [[Configurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问其属性。特性默认的值为true。

■ [[Enumerable]:表示能否通过for-in循环返回属性。默认值为true。

■ [[Writable]]:表示能否修改属性的值。默认值true。

■ [[Value]]:包含这个属性的数据值。读取属性值的时候,从这个位置读;写入属性值的时候,把新值保存在这个位置。默认值undefined。

 

要修改属性默认的特性,必须使用ECMAScript5的Object/defineProperty()方法。这个方法接受三个参数:属性所在的对象、属性的名字和一个描述符对象。描述符对象的属性必须是:configurable、enumerable、writable、value。设置其中的一或多个值,可以修改对应的特性值。例如:

var person = {};
object.defineProperty(person,"name",{
writable: false,
value: "Nicholas"
});

alert(person.name);
person.name = "Grey";
alert(person.name);

这个例子创建了一个name属性,只读。

var person = {};
object.defineProperty(person,"name",{
configurable: false,
value: "Nicholas"
});

alert(person.name);
person.name = "Grey";
alert(person.name);

configurable设置为false,表示不能从对像中删除谁许属性。一旦把属性定义为不可配置的,就不能再把它便会可配置了。此时,再调用Oject.defineProperty()方法修改除writable之外的特性,都会导致错误。

可以多次调用Object.defineProperty()方法修改同一个属性,但是把configurable特性设置为false之后就会有限制。

2、访问器属性

访问其属性不包含数据值:他们包含一对getter和setter函数(不是必需的)。在读取访问器属性时,调用getter函数。在写入访问器时,会调用settr函数并传入新值,这个函数负责决定如何处理数据。访问器属性有4个特性。

■ [[Configurable]]:表示能否通过delete删除属性从而重新定义属性,能否把属性修改为数据属性。特性默认的值为true。

■ [[Enumerable]]:表示能否通过for-in循环返回属性。默认值为true。

■ [[Get]]:读取属性时调用的函数。默认值undefined。

■ [[Set]]:写入属性时调用的函数。默认值undefined。

访问器谁许诺过不能直接定义,必须使用Object.defineProperty()来定义。

var book = {
  _year:2004,
edition:1
};

Object.defineProperty(book,"year",{
get:function(){
return this._year;
},
set:function(newValue){
if(newVlue>2004){
this._year = newVlue;
this.edition+=newVlue- 2004;
}
}
});
book.year=2005;
alert(book.edition);

_year前面的下划线是一种常见的记号,用于表示只能通过对象方法访问的属性。

以上是关于面向对象的程序设计的主要内容,如果未能解决你的问题,请参考以下文章

Java中面向对象的三大特性之封装

Scala的面向对象与函数编程

python之路之前没搞明白4面向对象(封装)

JAVA方法的定义

PHP面向对象之选择工厂和更新工厂

面向面试编程代码片段之GC