ECMA5规定了只有内部才有的特性,描述了属性的各种特征,这些特性用于实现JavaScript引擎,因此在Js中不能直接访问他们。为了标识特性,我们一般会他们放入两对方括号中。

ECMAScript中有两种属性:数据属性、访问器属性,其中访问器属性不能直接定义,而是通过Object.defineProperty()方法来定义创建,下面会讲这种方法。

需要修改属性默认的特性,则要用到Object.defineProperty()方法了。

Object.defineProperty(属性所在对象,属性名字,描述符对象):其中描述符对象的属性包括configurable、enumerable、writable、value,可修改其中的一或多个属性来修改对应的特性值。

此方法在IE8中只能在DOM对象上使用,而且只能创建访问器属性。(部分实现)

完全实现这个方法的浏览器有:IE9+、Firefox 4+、Safari 5+、Opera 12+、Chrome。

*configurable、enumerable、writable这三个属性若不指定,则默认为false。

var person={};
Object.defineProperty(person,'name',{
value:'a'
});
delete person.name;
alert(person.name);//a var person2={};
Object.defineProperty(person2,'name',{
configurable:true,
value:'a'
});
delete person2.name;
alert(person2.name);//undefined

若将configurable设置为false之后,再设置它为true是无效的。一旦把属性定义为不可配置的,就不能再把它变回可配置的了。

其他两个属性的使用如下:

var person={};
Object.defineProperty(person,'name',{
writable:false,
value:'a'
});
alert(person.name);//a
person.name='b';
alert(person.name);//a
Object.defineProperty(person,'name',{
enumerable:false
});
for(var prop in person){
alert(prop);//不显示
}

访问器属性的常见使用方式:设置一个属性的值导致其他属性发生变化:

var book={
_year:2004,//_标记着只能通过对象方法访问的属性
edition:1
};
Object.defineProperty(book,'year',{
get:function(){
return this._year;
},
set:function(newVal){
if(newVal>2004){
this._year=newVal;
this.edition+=newVal-2004;
}
}
});
book.year=2005;
alert(book.edition);//

除了Object.defineProperty()方法还有Object.defineProperties()方法可以定义多个属性,语法如下:

Object.defineProperties(属性所在对象,{属性1:{描述符对象},{属性2:{描述符对象}}......})

那么要如何获取属性的描述符呢?

Object.getOwnPropertyDescriptor()方法就能做到,语法如下:

Object.getOwnPropertyDescriptor(属性所在的对象,要读取其描述符的属性名称):返回描述符对象。

var person={};
Object.defineProperty(person,'name',{
writable:false,
value:'a' });
var discriptor=Object.getOwnPropertyDescriptor(person,'name');
alert(discriptor.writable);//false
alert(discriptor.value);//'a'

原型对象.isPrototypeOf(实例对象):判断实例对象的原型是不是这个原型对象

Object.getPrototypeOf(实例对象):根据实例对象获得原型对象

function Person(){
}
Person.prototype.name='a';
Person.prototype.sayName=function(){
alert(this.name);
}
var p1=new Person();
var p2=new Object();
alert(Person.prototype.isPrototypeOf(p1));//true
alert(Person.prototype.isPrototypeOf(p2));//false
alert(Object.getPrototypeOf(p1));//Object object(Person也是Object,所以会返回Object)
alert(Object.getPrototypeOf(p2));//Object object
alert(Object.getPrototypeOf(p1)==Person.prototype);//true
alert(Object.getPrototypeOf(p1).name);//'a'
alert(Object.getPrototypeOf(p2)==Person.prototype);//false

实例对象.hasOwnProperty(属性):检测一个属性是存在于实例中,还是存在于原型中。若存在于实例中,则返回true。

function Person(){
}
Person.prototype.name='a';
Person.prototype.sayName=function(){
alert(this.name);
}
var p1=new Person();
var p2=new Person();
p2.name='b';
alert(p1.hasOwnProperty('name'));//false
alert(p2.hasOwnProperty('name'));//true

但是上面的方法若是遇到不存在于原型对象也不存在于实例对象中的属性也返回false,这样就不好判断是不是存在于原型对象中,所以就要用到In操作符了。

in操作符:在通过对象能访问给定属性时返回true,无论在实例对象还是原型对象中。

结合in操作符,我们可以定义一个检测属性位于实例对象还是原型对象中的方法:

function Person(){
}
Person.prototype.name='a';
Person.prototype.sayName=function(){
alert(this.name);
}
var p1=new Person();
var p2=new Person();
p2.name='b';
alert(hasPrototypeProperty(p1,'name'));//true
alert(hasPrototypeProperty(p2,'name'));//false function hasPrototypeProperty(obj,attr){
return !obj.hasOwnProperty(attr)&&(attr in obj);
}

Object.keys(对象):返回一个包含所有可枚举属性的字符串数组。

Object.getOwnPropertyNames(对象):返回所有属性,包括了不可枚举的属性。

function Person(){
}
Person.prototype.name='a';
Person.prototype.sayName=function(){
alert(this.name);
}
alert(Object.keys(Person.prototype));//name,sayName
alert(Object.getOwnPropertyNames(Person.prototype));//constructor,name,sayName

*注:constructor和prototype属性的[[Enumerable]]默认为false。

支持这两个方法的浏览器:IE 9+、Firefox 4+、Safari 5+、Opera 12+、Chrome。

ECMA5中定义的对象属性特性和方法的更多相关文章

  1. Spring中使用事务搭建转账环境方法二 相对简便的注解方法 ——配置文件注入对象属性需要setter方法 注解方法,不需要生成setter方法

    XML配置文件代码如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...

  2. vue2.x版本中Object.defineProperty对象属性监听和关联

    前言 在vue2.x版本官方文档中 深入响应式原理 https://cn.vuejs.org/v2/guide/reactivity.html一文的解释当中,Object.defineProperty ...

  3. CorelDRAW中如何复制对象属性详解

    复制对象属性是一种比较特殊.重要的复制方法,它可以方便而快捷地将指定对象中的轮廓笔.轮廓色.填充和文本属性通过复制的方法应用到所选对象中.本教程将详解CorelDRAW中如何复制对象属性. Corel ...

  4. 继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类。 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。 (4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。 分析以上程

    继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法.(3)子类中定义的成员变量和父类中定义的 ...

  5. js 中对象属性特性的描述

    如何自定义属性的特性? 用对象.属性的特性和自定义的属性的特性有什么区别? 它的四大特性 writable   enumerable   configable   有什么区别? 先预习一个用对象.属性 ...

  6. VB 中定义FileSystemObject对象,要先添加对象

     存取文件的方法有很多种,可以使用上述VB提供的函数,使用Windows API函数等等,但是最简单的方法是使用FileSystemObject对象. 1.使用FileSystemObject对象 F ...

  7. javascript中的array对象属性及方法

    Array 对象 Array 对象用于在单个的变量中存储多个值. 创建 Array 对象的语法: new Array(); new Array(size); new Array(element0, e ...

  8. javascript中的style只能取到在HTML中定义的css属性

    如果在css中定义的 li{ width:100px; left:100px; top:; position:absolute; font-style:normal; } 这样执行: oli[0].s ...

  9. JS中delete删除对象属性

    1.删除对象属性 function fun(){   this.name = 'mm';   }   var obj = new fun();   console.log(obj.name);//mm ...

随机推荐

  1. Mysql数据库删除重复数据

    最近因为发现数据库中的表有脏数据,需要维护.这些脏数据就是重复数据,需要将其删除. 现假设有一张test表,主键字段为num,还有id,one,two三个字段.假设id规定只能有一条记录(即需要为id ...

  2. Django+ajax 返回json数据挨个显示在页面及页面和后台相互传值

    通过Ajax传到后台一个值,根据该值返回数据库表中的某一列的值,然后逐个显示到页面,并且给每个加上超链接,可以进行点击查看详细信息 1.通过Ajax传到后台一个值,红色部分为往Django后台传值,蓝 ...

  3. nginx简单安装

    虚拟机首先要求ping www.baidu.com 下载: 解压: 创建用户: [root@nginx ~]# useradd -M -s /sbin/nologin nginx-M 不创建加目录   ...

  4. 使用java读取解析txt文本数据,管理简单的数据

    在实际开发中会经常碰到使用编程语言读取文本文件的内容,这内容可以是各种各样的一下本人写出我自己做的一个读取文本文件的例子,文件中存储的是我的个人网站 www.yzcopen.com 导航栏目因为懒得使 ...

  5. Datagridview 实现二维表头和行合并

    借鉴别人的,改了改,没用timer using System;using System.Collections.Generic;using System.ComponentModel;using Sy ...

  6. 《C程序设计语言》练习1-10

    #include<stdio.h> main() { int c; c=getchar(); while (c !=EOF) { if (c=='\t') { c='\\'; putcha ...

  7. yaml文件的格式

    后缀为.yml    格式一般就是key:空格 value    这里的value可以是 普通数据(数字,字符串)   ---------------------------------------- ...

  8. 零基础学习Web前端开发

    目录 技术背景 开发环境 学习过程 参考资料 结束语 技术背景 什么是前端开发? 前端开发是创建Web页面或App等将界面呈现给用户的过程.通过使用 HTML,CSS,JavaScript,以及它们衍 ...

  9. IE11阅读视图:带给你静心饕餮阅读大餐的片刻

    编者按:又到读书日,今天你挤出时间读书了吗?如今,越来越多人在习惯电子阅读,然而总难逃眼花缭乱的干扰信息.Internet Explorer 11新增阅读视图功能,一键开启,给你带给你静心饕餮阅读大餐 ...

  10. centos 中文乱码解决办法

    缘由:本人在虚拟机中安装centos 5.3,起初安装时选择了english,后来使用的过程中发现打开网页,会出现中文乱码,无法正常显示.当然,本地文件中的中文更是无法显示. 若是将系统语言langu ...