面向对象的程序设计-理解对象

理解对象



创建自定义对象的最简单方式就是创建一个Object的实例,然后再为它添加属性和方法

1     var person = new Object();
2     person.name = "Nicholas";
3     person.age = 29;
4     person.job = "SoftWare Engineer";
5     person.sayName = function(){
6         alert(this.name);
7     };

创建对象的首选模式是对象字面量方式

1     var person = {
2         name: "Nicholas",
3         age: 29,
4         job: "SoftWare Engineer",
5         sayName: function(){
6             alert(this.name);
7         }
8     };

属性类型



内部属性无法直接访问,ECMAScript5把它们放在两对方括号中,分为数据属性和访问器属性

1、数据属性

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

[[Configurable]]:表示能否通过delete输出属性从而定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性,默认值为true
[[Enumerable]]:表示能否通过for-in循环返回属性,默认值为true
[[Writable]]:表示能否通过修改属性的值,默认值为true
[[Value]]:包含这个属性的数据值,读取属性值的时候,从这个位置读;写入属性值的时候,把新值保存在这个位置

要修改属性默认的特性,必须使用ECMAScript5的Object.defineProperty()这个方法.这个方法接受三个参数:属性所在的对象、属性的名字和一个描述符对象

1     var person = {};
2     Object.defineProperty(person,"name",{
3         writable: false,//设置为不可修改属性的值
4         value: "Nicholas"
5     });
6
7     console.log(person.name); // " Nicholas"
8     person.name = "Oreg";
9     console.log(person.name); // " Nicholas"

把donfigurable设置为false,表示不能从对象中删除属性。一旦把属性定义为不可配置的,就不能再把它变回可配置的了。此时,在调用Object.defineProperty()方法修改处writable之外的特性,都会导致错误

 1     var person = {};
 2     Object.defineProperty(person,"name",{
 3         configurable: false,
 4         value: "Nicholas"
 5     });
 6
 7     //抛出错误
 8     Object.defineProperty(person,"name",{
 9         configurable: true,
10         value:"Nicholas"
11     });

在调用Object.defineProperty()方法时,如果不指定,configurable、enumerable和writable特性的默认值都是false

2、访问器属性

访问器属性不包含属性值;他们包含一对儿getter和setter函数,在读取访问器属性时,会调用setter函数,这个函数负责返回有效的值,在写入访问器属性时,会调用getter函数,并传入新值,这个函数决定如何处理数据。访问器属性有如下4个特性

[[Configurable]]:表示能否通过delete输出属性从而定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性,默认值为true
[[Enumerable]]:表示能否通过for-in循环返回属性,默认值为true
[[Get]]:在读取属性时调用的函数。默认值为undefined
[[Set]]:在写入属性时调用的函数。默认值为undefined

访问器属性不能直接定义,必须使用Object.defineProperty()来定义。

 1     var book = {
 2         _year: 2004,
 3         edition: 1
 4     };
 5
 6     Object.defineProperty(book,"year",{
 7         get: function(){
 8             return this._year;
 9         },
10         set: function(newValue){
11             if(newValue > 2004){
12                 this._year = newValue;
13                 this.edition += newValue - 2004;
14             }
15         }
16     });
17
18     book.year = 2005;
19     console.log(book.edition); //2

这是使用访问器的常见方式,即设置一个属性的值会导致其他属性发生变化,year前面的下划线是一种
常用的记号,用于表示只能通过对象方法访问的属性

不一定非要同时指定getter和setter。只指定getter意味着属性是不能写的,只指定setter函数的属性
也不能读

两个非标准的方法:__defineGetter__()和__defineSetter__()

 1     var book = {
 2         _year: 2004,
 3         edition: 1
 4     };
 5
 6     book.__defineGetter__("year",function(){
 7             return this._year;
 8         });
 9     book.__defineSetter__("yeat",function(newValue){
10                     if(newValue > 2004){
11                 this._year = newValue;
12                 this.edition += newValue - 2004;
13             }
14     });
15
16     book.year = 2006;
17     console.log(book.year);

定义多个属性



Object.defineProperties()方法。利用这个方法可以通过描述符一次定义多个属性。

 1     var book = {};
 2
 3     Object.defineProperties(book,{
 4         _year: {
 5             value: 2004
 6         },
 7         edition: {
 8             value: 1
 9         },
10         year: {
11             get: function(){
12                 return this._year;
13             },
14             set: function(newValue){
15                 if(newValue > 2004){
16                     this._year = newValue;
17                     this.edition += newValue - 2004;
18                 }
19             }
20         }
21     });

读取属性的特性



Object.getOwnPropertyDescriptor()方法,可以取得给定属性的描述符

 1     Object.getOwnPropertyDescriptor()方法,可以取得给定属性的描述符
 2
 3     var book = {};
 4
 5     Object.defineProperties(book,{
 6         _year: {
 7             value: 2004
 8         },
 9         edition: {
10             value: 1
11         },
12         year: {
13             get: function(){
14                 return this._year;
15             },
16             set: function(newValue){
17                 if(newValue > 2004){
18                     this._year = newValue;
19                     this.edition += newValue - 2004;
20                 }
21             }
22         }
23     });
24
25     var descriptor = Object.getOwnPropertyDescriptor(book,"_year");
26     console.log(descriptor.value); //2004
27     console.log(descriptor.configurable); //false
28     console.log(typeof descriptor.get); //"underfined"
29
30     var descriptor = Object.getOwnPropertyDescriptor(book,"year");
31     console.log(descriptor.value); //underfined
32     console.log(descriptor.enumerable); //false
33     console.log(typeof descriptor.get); //"function"
时间: 2024-08-06 03:42:51

面向对象的程序设计-理解对象的相关文章

03.JavaScript 面向对象精要--理解对象

JavaScript 面向对象精要--理解对象 尽管JavaScript里有大量内建引用类型,很可能你还是会频繁的创建自己的对象.JavaScript中的对象是动态的. 一.定义属性 当一个属性第1次被添加给对象时JavaScript在对上上调用了一个名为 [[Put]]的内部方法,该方法会在对象上创建一个新节点保存属性,就像 哈希表上第一次添加一个键一样这个操作不仅指定了初始值 也定义了属性的一些特征 1.1 [[Put]]内部方法 [[Put]]在对象上创建一个自有属性 1.2 [[Set]

JS面向对象设计(1)-理解对象

不同于其他面向对象语言(OO,Object-Oriented),JS的ECMAScript没有类的概念, 它把对象定义为"无序属性(基本值.对象.函数)的集合",类似于散列表. 每个对象都是基于一个引用类型(原生类型.自定义类型)创建的. 1. 理解对象 创建自定义对象(Object构造函数.对象字面量). // Object构造函数:创建一个Object实例,再为实例添加属性和方法. var person = new Object(); person.name = "xia

面向对象 ( OO ) 的程序设计——理解对象

1 创建自定义对象 创建自定义对象的最简单方法为创建 Object 的实例,并添加属性方法,也可以使用对象字面量 2 访问器属性 访问器属性包括 getter 和 setter 函数,读取访问器属性时,调用 getter 函数,写入访问器属性时,调用 setter 属性 1 var people = { 2 _year: 1995, 3 age: 0 4 }; 5 6 Object.defineProperty(people, "year", { 7 get:function(){ 8

面向对象精要-理解对象

1.创建对象 创建对象的两种方法: 使用Object构造函数 var person2 = new Object(); person2.name="Qian"; 使用对象的字面形式 var person1={ name:"Qian" }; 对象添加以及修改时JavaScript会在对象上调用[[Put]]和[[Set]]方法 2.属性探测 2.1.使用“in”操作符 console.log("name" in person1)/*true*/ 2.

javascript面向对象系列1——理解对象

[对象定义]无序属性的集合,其属性可以包含基本值.对象或者函数 //简单的对象实例 var person = new Object(); person.name = "Nicholas"; person.age = 29; person.job = "Software Engineer"; person.sayName = function(){ alert(this.name); } [内部属性类型]内部属性无法直接访问,ECMAScript5把它们放在两对方括号

JavaScript 面向对象的程序设计(一)之理解对象属性

首先,JavaScript 面向对象的程序设计,主要分三部分. 理解对象属性: 理解并创建对象: 理解继承. 本文主要从第一方面来阐述: 理解对象属性 首先我们来理解Javascript对象是什么?在Javascript中,万物皆对象.其中创建自定义对象的最简单的方式就是创建一个Object的实例,如下: ECMAScript中有两种属性:数据属性和访问器属性. 数据属性:其中数据属性有四个描述其行为的特性:Configurable: 表示能都通过delete删除属性从而重新定义属性.Enume

第六章 面向对象的程序设计 (1 理解对象)

面向对象(Object-Oriented,OO)的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象. ECMA-262 把对象定义为:"无序属性的集合,其属性可以包含基本值.对象或者函数."严格来讲,这就相当于说对象是一组没有特定顺序的值.对象的每个属性或方法都有一个名字,而每个名字都映射到一个值.正因为这样,我们可以把ECMAScript 的对象想象成散列表:无非就是一组名值对,其中值可以是数据或函数. 每个对象都是基于一个引用类型创建的. 6

第六章-面向对象的程序设计(理解对象)

ESMA把对象定义为:"无序属性的集合,其属性可以包含基本值,对象和函数".严格的讲,这相当于说对象是一组没有特定顺序的值,对象的每个属性或方法都有一个名字,而每一个名字都映射到一个值. 1.理解对象 创建对象有对象字面量的方法,这种方法比较常用,也是比较推荐的. 1 var person ={ 2 name:'xu', 3 age:27, 4 sayName:function(){ 5 alert(this.name); 6 } 7 }; 还有创建对象的实例的方法: 2.属性的类型

《JavaScript高级程序设计》第六章【面向对象的程序设计】 包括对象、创建对象、继承

一.理解对象 ECMAScript中有两种属性:数据属性和访问器属性. 二.创建对象 1. 工厂模式 使用简单的函数创建对象,为对象添加属性和方法,然后返回对象.这种方法后来被构造函数模式所取代. 2. 构造函数模式 可以创建自定义引用类型,可以像创建内置对象实例一样使用new操作符.但是它的每个成员都无法得到复用,包括函数. 但是这样说好像也不准确——如果是通过一个指针指向构造函数外部的函数的话,应该算是复用? 1 function Person(name,age){ 2 this.name