前言

  权威指南中摘要的,工作中用不到的,重要的js基础。

三类对象两类属性

  内置对象(native object) 是由ECMScript规范定义的对象或者类。例如:函数,数组,日期,正则...

  宿主对象(host object) 是由js编译器所嵌入的宿主环境(web浏览器)所定义的。比如客户端js中表示网页结构的HTMLElement对象就是宿主环境创建的对象。宿主环境定义的对象可以直接使用的话,我们也可以把它们当做内置对象。

  自定义对象(user-defined object) 由运行中的js创建的对象。

  自有属性(own property) 直接在对象当中定义的属性,区别于继承属性。

  继承属性(inherited property) 在对象原型中定义的属性。

属性描述符对象

  ES5中定义了一个属性描述符对象(property descriptor)。这个对象属性和他们所描述的属性特性是同名的。

  value:属性的值值。

  writable:可写性,是否可以设置值。

  enumerable:可枚举性,遍历对象时该属性会不会出现。

  configurable:可配置性。

作为属性特性的存取器

  对象属性是由名字和值跟一组属性特性构成的,属性值可以用一个或两个方法进行替代,这两个方法就是getter和setter定义的属性特性。由getter和setter定义的属性叫做“存取器属性”。

  存取器属性的特点:

    1,当程序查询存取器属性值时,js调用getter方法。这个方法返回的就是属性存取表单式的值。

    2,当程序设置存取器属性值是,js调用setter方法。这个方法将赋值表达式右边的计算结果,传入setter。

    3,存取器属性不具有可写性,如果同时具有getter和setter方法那它就是一个读写属性。也可以只拥有其中一个,来作为只读或者只写属性。

  定义存取器属性

var o = {
// 普通的数据属性
data:null;
// 存取器属性
set ODate(value){
this.data = value; // 处理复制表达式右侧计算结果(value)的属性设置表达式
},
get ODate(){
return this.data; // 属性返回表达式
}
}
// 设置data,获取data
o.OData = {id:0};
o.OData; =>{id:0}

获取自有属性的属性描述符对象Object.getOwnPropertyDescriptor()

// 当我们为对象创建属性时如果没有指定属性描述符,那就都是默认的 可枚举,可配置,可读写,
var obj = {
name:"小花"
}
console.log(Object.getOwnPropertyDescriptor(obj,"name"));
 {value: "小花", writable: true, enumerable: true, configurable: true}

定义属性描述符对象Object.defineProperty(obj,attributeName,PropertyDescriptor)

// 定义cat的name属性为不可枚举(此后使用for in 遍历对象属性时,name不会出现),value为小花
var cat = {};
Object.defineProrerty(cat , "name",{
value:"小花",
enumerable:false
})

同时定义或修改对象的多个属性及其描述符Object.defineProperties()

// 参数一是目标对象,参数二是属性为键描述符为值的对象
var cat = Object.defineProperties({},{
name:{value:"小花"},
age:{value:6},
// 值为大菊,不可写
type:{value:"大菊",writable:false},
// 存取器特性替代属性值value,不可枚举
date:{
get:function(){return [this.name,this.age]},
enumerable:false
}
})

使用属性描述符实现jq中$.extend方法的部分功能:

  1,给根对象Object的原型拓展一个extend方法。

  2,接收要复制的目标对象,将他的属性和属性特性复制到调用对象。

  3,复制规则:存在同名属性时保留原有属性,复制目标对象上的一切可枚举自有属性。

Object.defineproperty(Object.prototype,"extend",{
enumerable:false,
value:function(o){
// 得到O对象的所有自有属性名称列表
var proNames = Object.getOwnPropertyNames(o);
// 排除已存在属性
for(var i = 0; i < proNames.length; i++){
if(proNames[i] in this) continue;
// 获取该属性的属性描述符对象
var desc = Object.getOwnpropertyDescriptor(o,proName[i]);
// 将属性copy到调用对象
Object.defineProperty(this,proName[i],desc);
}
}
})

小结:

  》三类对象:内置对象,宿主对象,自定义对象。

  》两类属性:自有属性,继承属性。

  》存取器属性:区别于数据属性,属性名称就是getter、setter方法名称。

  》属性每个属性都拥有属性描述符对象,不显示定义属性的描述符对象时,他们默认都是可读写,可枚举,可配置的。

  》ES5提供了两个API用来定义或修改属性及其描述符:

    获取指定对象指定属性的属性描述符对象:Object.getOwnPropertyDescriptor()

    同时定义多个属性及其描述符:Object.defineProperties()

    定义单个属性及其描述符:Object.defineProperty(obj,attributeName,PropertyDescriptor)

  》js中的普通对象能够从根对象上继承到它提供的属性方法。我们基于这个特性为根对象创建了一个extend方法可以用来复制其他对象上的自有可枚举属性。

  

  

js对象—类型和属性特性的更多相关文章

  1. js对象可扩展性和属性的四个特性(上)

    # js对象可扩展性和属性的四个特性(上) 一.前言 再次花时间回顾一下基础,毕竟要想楼建的好,地基就要牢固,嘻嘻! 在开始之前需要具备对prototype.__proto__.constructor ...

  2. js对象可扩展性和属性的四个特性(下)

    # js对象可扩展性和属性的四个特性(下) 一.前言 再次花时间回顾一下基础,毕竟要想楼建的好,地基就要牢固,嘻嘻! 在开始之前需要具备对prototype.__proto__.constructor ...

  3. 遍历js对象中的属性

    可以使用js自带的for in.也可以使用Ext JS中的方法来遍历js对象中的属性 代码如下: /** 遍历对象 */ var person = {name:'张泰松',age:28}; //js方 ...

  4. JS对象类型的确定

    JS是松散类型的语言,这一点JS的对象表现得尤为突出.那么如何来确定JS对象的具体类型呢? 首先,我们可以使用typeof运算符确定其基本类型(number,object,function,undef ...

  5. JavaScript中的对象描述符(属性特性)

    我们先创建一个对象: var person = { name: "Nicholas", _job: "Software Engineer", sayName: ...

  6. 判断js对象类型

    javascript中检测对象的类型的运算符有:typeof.constructor.instanceof.prototype. 1.typeof typeof是一个一元运算符,返回结果是一个说明运算 ...

  7. js 对象可枚举属性以及for in 循环和for of 循环

    js中每个对象的属性(js里万物皆属性,对象的属性也是对象)都有一个属性叫enumerable(可枚举性),这个属性true/false决定了该对象的属性是否可枚举(就是让一些方法访问到这个属性). ...

  8. js对象类型判断工具

    对象类型判断工具 /** *类功能:对象类型判断工具 **/ var TypeUtil = { /** *方法说明:是否是数组 **/ isArray: function (obj) {//是否是数组 ...

  9. js 对象类型 (对象的属性 ,对象的方法) this 关键字

    $(function () { var observation = { init: function () { this.render();//断点:this bind :function() che ...

随机推荐

  1. js 数据获取

    http://www.cnhan.com/shantui/templates/MC500/TP001/js/template.js var qiaoContent="0";//0默 ...

  2. 笔记,将CString转换为数值

           ANSI UNICODE TCHAR int    atoi    _wtoi  _ttoi long       atol    _wtol _ttol double   atof   ...

  3. node.js npm 安装spm失败,竟然是版本的问题

    SPM v.1.1.2 With SeaJS   SPM v1.1.2使用指南 1.SPM用途 SeaJS提供了模块化开发的机制,在代码开发完后,还需要做产品发布相关的一些操作. 这些可以通过SPM来 ...

  4. Apache Thrift的简单介绍

    1.什么是Thrift thrift是一种可伸缩的跨语言服务的发展软件框架.它结合了功能强大的软件堆栈的代码生成引擎,以建设服务.不同开发语言开发的服务可以通过该框架实现通信. thrift是face ...

  5. [noi2002]荒岛野人 拓展欧几里得

    克里特岛以野人群居而著称.岛上有排列成环行的M个山洞.这些山洞顺时针编号为1,2,…,M.岛上住着N个野人,一开始依次住在山洞C1,C2,…,CN中,以后每年,第i个野人会沿顺时针向前走Pi个洞住下来 ...

  6. Android如何配置init.rc中的开机启动进程(service)【转】

    本文转载自:http://blog.csdn.net/qq_28899635/article/details/56289063 开篇:为什么写这篇文章 先说下我自己的情况,我是个普通的大四学生,之前在 ...

  7. mysql学习笔记(七)—— MySQL内连接和外连接

        MySQL内连接(inner join on) MySQL的内连接使用inner join on,它的效果跟使用where是一样的,如果联结的是两个表,那么需要左右的条件或者说字段是需要完全匹 ...

  8. 《数学之美》第15章 矩阵计算和文本处理中两个分类问题——SVD分解的应用

    转载请注明原地址:http://www.cnblogs.com/connorzx/p/4170047.html 提出原因 基于余弦定理对文本和词汇的处理需要迭代的次数太多(具体见14章笔记),为了找到 ...

  9. Myeclipse+TestNG白盒测试环境搭建

    myeclipse基础环境搭建这里不讲了,我用的是myeclipse2013,网上有破解方法http://jingyan.baidu.com/article/aa6a2c14d0c9700d4c19c ...

  10. Python: PS 图像特效 — 模糊玻璃

    今天介绍一种基于高斯滤波和邻域随机采样,生成一种毛玻璃的图像特效,简单来说,就是先对图像做高斯滤波模糊,然后对模糊后的图像,通过对邻域的随机采样来赋予当前的像素点,这样,生成的图像有有一定的随机扰动和 ...