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

2018-04-23  本文已影响0人  astak3

面向对象的程序设计

ECMA-262 把对象定义为:无须属性的集合,其属性可以包含基本值、对象或者函数。

理解对象

var person = new Object();      //创建对象
person.name = "Nicholas";       //添加属性
person.age = 29;
person.job = "teacher";
person.sayName = function(){    //添加方法,this 表示当前作用域下的对象;this 表示new Objecy() 实例化出来的那个对象;this 要放在一个作用域下,比如person.sayName()是person 下的方法,方法可用this 表示方法本身。
    alert(this.name);
};

属性类型

ECMAScript 中有两种属性:数据属性和访问器属性,它们不能在JavaScript 中直接访问,规范把它们放在了两对[[]]中间,如:[[Enumerable]]。

数据属性
数据属性是包含一个数据值的属性,在这个位置可以读取和写入值。4个特性
[[Configurable]]:表示能否通过delete删除属性、能否修改属性的特性,能否把属性修改为访问器属性。默认true
[[Enumerable]:表示能通过for-in循环返回属性。默认true
[[Writable]]:表示能否修改属性值。默认true
[[Value]]:包含这个属性的数据值。默认undefined
例:

var person = {
    name: "Nicholas"        //[[Value]]的特性将这里设置为"Nicholas",对这个值的任何修改都讲反应在这里。
};

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

var person = {};
Object.defineProperty(person,"name",{       //person:属性所在的对象;name:属性名;花括号内是描述符对象
    writable: false,            //只读模式,true写入模式
    value: "Nicholas"
});
person.name = "zhangsan";
alert(person.name);             //打印"Nicholas" 因为这边是只读模式

在调用Object.defineProperty()时如果不指定configurableenumerablewritable,默认都是false

访问器属性
访问器属性不包含数据值,它们包含一对gettersetter函数。
getter:读取访问器属性调用
setter:写入访问器属性调用
4个特性:
[[Configurable]]:表示能否通过delete删除属性、能否修改属性的特性,能否把属性修改为访问器属性。默认true
[[Enumerable]:表示能通过for-in循环返回属性。默认true
[[getter]]:读取访问器属性调用,默认undefined
[[setter]]:写入访问器属性调用,默认undefined

上一篇下一篇

猜你喜欢

热点阅读