您的位置:首页 > 移动开发 > Objective-C

javascript中的Object.defineProperty()与getOwnPropertyNames ()方法

2017-06-30 22:55 761 查看
在接触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

出处:http://www.cnblogs.com/xinggood/p/6601067.html

https://msdn.microsoft.com/library/dd548687(v=vs.94).aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javascript 面向对象