在接触javascript面向对象的高级部分时,我一下子傻缺了。我看的是《javascript高级程序设计》第三版,其中第六章讲到面向对象的程序设计。我想接触过java,php5等语言的小伙伴们,对面向对象那是再熟悉不过了。我也一样,带着那一套思维再来看javascript的面向对象,一开始还真有点陌生,难以理解。前面几章我看得很快,但到了第六章有点费解,我停了一下。
关于属性类型,访问器属性,我们先来看看他们的相关函数的定义,再结合书中的实例看看。
定义
Object.defineProperty()函数是给对象设置属性的。
Object.defineProperty(object, propertyname, descriptor);
参数 | 描述 |
---|---|
object | 必须,要在其上添加或修改属性的对象。 |
propertyname | 必需。 一个包含属性名称的字符串。 |
descriptor | 属性描述符。 它可以针对数据属性或访问器属性。 |
参数descriptor有以下参数值:
Configurable: 总开关,一旦为false,就不能再设置他的(value,writable,configurable),表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。像前面例子中那样直接在对象上定义的属性,它们的这个特性默认值为:true。
Value :属性的值,默认为 undefined。
writable: 该属性是否可写,如果设置成 false,则任何对该属性改写的操作都无效(但不会报错,但是在严格模式下会报错。),对于像前面例子中直接在对象上定义的属性,这个属性该特性默认值为为 true。
enumerable:定义了对象的属性是否可以在 for…in 循环和 Object.keys() 中被枚举。
get: 对定义的属性取值的时候会触发get 对应的函数,并且返回结果,默认返回undefined。
set:对定义的属性赋值的时候会触发set 对应的函数
关于Configurable在上文中讲到总开关的事,在此我想结合《javascript高级程序设计》中的例子来测试一下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script type="text/javascript">
//定义一个空的对象
var person={};
//结合Object.defineProperty方法来定义属性名,以及给值
Object.defineProperty(person,"name",{
value:"Nicholas",
configurable:false
});
document.write(person.name);
person.name="xiaohong";
document.write("<br>");
document.write(person.name);
</script>
</body>
</html>
output:
Nicholas
Nicholas
看样是没错的,即使重新给属性name赋值,它还是输出同样的结果,结果没变。下面我们再看看给出writable的结果,这次上述代码基本没变,只是给出了一个writable.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script type="text/javascript">
//定义一个空的对象
var person={};
//结合Object.defineProperty方法来定义属性名,以及给值
Object.defineProperty(person,"name",{
value:"Nicholas",
configurable:false,
writable:true
});
document.write(person.name);
person.name="xiaohong";
document.write("<br>");
document.write(person.name);
</script>
</body>
</html>
output:
Nicholas
xiaohong
其结果发生了改变,可见writable的级别要高于configurable,属性的值是否可读可写最关键取决于writable.
在网上查阅微软讲解的相关javascript的Object对象资料的时我还看到getOwnPropertyNames()方法,在此我想顺便也看一下getOwnPropertyNames()方法,我认为微软的资料讲得很好。
Object.getOwnPropertyNames定义
定义:返回对象自己的属性的名称。一个对象的自己的属性是指直接对该对象定义的属性,而不是从该对象的原型继承的属性。对象的属性包括字段(对象)和函数。
语法:
Object.getOwnPropertyNames(object)
参数表
参数 | 定义 |
---|---|
object | 必需。包含自己的属性的对象。 |
接着我们再结合上面的例子,看看其方法的用法.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script type="text/javascript">
//定义一个空的对象
var person={};
//结合Object.defineProperty方法来定义属性名,以及给值
Object.defineProperty(person,"name",{
value:"Nicholas",
configurable:false,
writable:true
});
document.write(person.name);
document.write("<br>");
person.name="xiaohong";
var x=Object.getOwnPropertyNames(person);
for(var i=0;i<x.length;i++){
var y=x[i];
document.write(y+":"+person[y]);
}
</script>
</body>
</html>
output:
Nicholas
name:xiaohong