JavaScript学习笔记-对象
枚举对象的属性:通常用for(...in...)来循环遍历,由于 for in 总是要遍历整个原型链,因此如果一个对象的继承层次太深的话会影响性能
for(var i in foo){
if(foo.hasOwnProperty(i)){
console.log(i);
}
}
推荐总是在for in使用 hasOwnProperty,因为类库被包含在页面中时,不使用 hasOwnProperty 过滤的 for in循环难免会出问题。
p.hasOwnProperty('x') //检查对象p是否含有自有属性x,若x是继承属性则返回false
p.propertyIsEnmuerable('x') //检查属性x是否可被枚举
对象继承来的内置方法是不可枚举的,如:toString()
自行添加的属性均是可枚举的,除非被转为不可枚举;
Object.keys() 返回一个数组,一个由对象的所有可枚举属性的名字组成的数组;
Object.getOwnPropertyNames() 返回所有自有属性名称组成的数组;
function anotherKeys(o){
if(typeof o !== 'object') throw TypeError;
var result = [];
for(var prop in o){
if(o.hasOwnProperty(prop)) result.push(prop);
}
return result;
}
get和set:可将属性定义为只读、只写、可读可写,如:
var f = {
i:0,
get a(){
return this.i;
},
set a(newValue){
this.i = newValue;
}
}
数据属性、存取器属性
数据属性的4个特性:value、 writable、 enumerable、 configurable;
存取器属性的4个特性:get、 set、 enumerable、 configurable;
属性描述符对象( property descriptor),它的属性名就是这4个特性名;
Object.getOwnPropertyDescriptor(p,'x') 返回p的自有属性x的描述符对象{value:3,writable:true,enumerable:true,configurable:true}
新建属性时,要想它同时具有某种特性,需要调用Object.defineProperty(p,'x',propotyDescriptor)
同时修改多个属性:Object.definePropoties(p,{x:propotyDecriptor,y:propotyDescriptor,....})
//为新对象p设置属性
var p = Object.defineProperties({},{
x:{value:1,writable:true,enumerable:true,configurable:true},
y:{value:3,writable:true,enumerable:true,configurable:true},
r:{
get:function(){return this.x},
set:function(value){this.x=value*2},
enumerable:true,
configurable:true
}
});
//给Object.prototype添加一个extend()方法,任何对象都是继承自Object,所以任何对象都能调用该方法
Object.defineProperty(Object.prototype,'extend',{
writable:true,
enumerable:false,
configurable:false,
value:function(o){
var names = Object.getOwnPropertyNames(o);
for(var i=0;i<names.length;i++){
if(names[i] in this) continue;
var desc = Object.getOwnPropertyDescriptor(o,names[i]);
Object.defineProperty(this,names[i],desc);
}
}
});
var p1 = {a:1,b:2};
var p2 = {};
p2.extend(p1);
console.log('a' in p2); //true
属性4个特性修改规则:
1.若对象不可扩展,则不能创建新属性,只能更改已有属性;
2.若属性为不可配置的,即configurable:false,则不能更改可配置性、可枚举性等所有特性,包括不能把数据属性和存取属性相互转换,但是唯一可以改的就是:将可写性从true改为false,相反则不行;
使用Object.definePropoty()或Object.definePropoties()时违反以上规则,会抛出类型错误异常;
对象的三个属性
每个对象都有与之相关的三个属性:原型属性prototype,类属性class,可扩展性extensible;
对象的原型属性prototype是用来继承属性的,通过对象直接量创建的对象的原型是Object.prototype,通过new创建的对象的原型是构造函数的prototype,通过Object.create(p)创建的对象使用参数p作为它的原型;
不管以何种方式创建的对象都有一个constructor属性,指代原型的构造函数,因此对象的真正原型是constructor.prototype;
Object.getPrototypeOf(p)可以查询对象p的原型,用p.isPrototypeOf(o)来检测对象p是否是对象o的原型;
对象的类属性为一个字符串,表示对象的类型信息,默认的toString()方法返回字符串[object class],然后通过对字符串执行slice(8,-1)来提取对象的类型信息
function classOf(o){
return Object.prototype.toString.call(o).slice(8,-1);
}
classOf(null); //'Null'
classOf(1); //'Number'
classOf(''); //'String'
classOf(false); //'Boolean'
classOf({}); //'Object'
classOf([]); //'Array'
classOf(/./); //'Regexp'
classOf(new Date()); //'Date'
classOf(window); //'Window'
function f(){}
classOf(new f()); //'Object'
可扩展性:是否可以给对象添加新属性,默认均是可扩展的
判断对象p的可扩展性:Object.isExtensible(p); 转换为不可扩展:Object.preventExtensions(p); 此转换不可逆转,只影响对象p本身的可扩展性,对象p仍然可以继承在他的原型上新添加的属性,设为不可扩展目的是锁定对象,避免外界干扰,通常和属性的可配置性与可写性配合使用;
Object.seal(p)封闭对象p,让他的所有自有属性都设置为不可配置,Object.isSealed(p)检查是否封闭;
Object.freeze(p)冻结,更严格地锁定对象p,不可扩展、所有自有属性不可配置、所有数据属性设为只读(具有set方法的存取属性不受此影响),检测Object.isFrozen(p);
锁定、封闭、冻结方法均返回传入的对象;
var o = Object.seal(Object.create(Object.freeze({x:1}),{y:{value:2,writable:true}}));
创建一个封闭对象o,包含一个冻结的原型{x:1}和一个不可枚举的属性y
系列化对象:将对象的状态转换为字符串,也可将字符串还原为对象
JSON:JavaScript Object NOtation,(对象表示法)
其JSON.stringify(p)系列化对象p的可枚举的自有属性,JSON.parse(str)字符串还原为对象;
不能系列化的属性在输出字符串时会被省略掉;JSON的语法是JavaScript语法的子集,它只能表示:对象、数组、字符串、无穷大数字、true、false、null,其中NaN、Infinity系列化为null,日期对象系列化为日期字符串且不可还原;
不能系列化和还原:函数、RegExp、Error对象、undefined;
JavaScript学习笔记-对象的更多相关文章
- JavaScript学习笔记——对象知识点
javascript对象的遍历.内存分布和封装特性 一.javascript对象遍历 1.javascript属性访问 对象.属性 对象[属性] //字符串格式 //javascript属性的访问方法 ...
- JavaScript学习笔记——对象分类
对象的分类 一.对象的分类 1.内置对象 Global Math 2.本地对象 Array Number String Boolean Function RegExp 3.宿主对象 DOM BOM 二 ...
- JavaScript学习笔记——对象基础
javascript对象基础 一.名词解释: 1.基于对象 一切皆对象,以对象的概念来编程. 2.面向对象编程(oop Object oriented programming) A.对象 就是人们要研 ...
- JavaScript学习笔记——对象的创建
对象是JavaScript基本数据类型,在JavaScript中除了Undefined.Null.布尔型(ture.false).字符串和数字之外,其他的都属于对象. 在JavaScript中,一个对 ...
- JavaScript:学习笔记(9)——Promise对象
JavaScript:学习笔记(9)——Promise对象 引入Promise Primose是异步编程的一种解决方案,比传统的解决方案回调函数和事件更加合理和强大.如下面为基于回调函数的Ajax操作 ...
- JavaScript:学习笔记(8)——对象扩展运算符
JavaScript:学习笔记(8)——扩展运算符 对象的扩展运算符 扩展运算符是三个点(...).用于取出参数对象的所有可遍历属性,然后拷贝到当前对象之中. 如上图所示,新建了一个对象a,然后通过扩 ...
- JavaScript:学习笔记(10)——XMLHttpRequest对象
JavaScript:学习笔记(10)——XMLHttpRequest对象 XHR对象 使用XMLHttpRequest (XHR)对象可以与服务器交互.您可以从URL获取数据,而无需让整个的页面刷新 ...
- Javascript学习笔记——操作浏览器对象
Javascript学习笔记 目前尝试利用javascript去对于一个浏览器对象完成一系列的访问及修改, 浏览器是网页显示.运行的平台,常用的浏览器有IE.火狐(Firefox).谷歌(Chrome ...
- Java程序猿的JavaScript学习笔记(汇总文件夹)
最终完结了,历时半个月. 内容包含: JavaScript面向对象特性分析,JavaScript高手必经之路. jQuery源代码级解析. jQuery EasyUI源代码级解析. Java程序猿的J ...
随机推荐
- 《BI那点儿事》Microsoft 时序算法——验证神奇的斐波那契数列
斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10 ...
- 【原创】C#玩高频数字彩快3的一点体会
购彩风险非常高,本人纯属很久以前对数字高频彩的一点研究.目前已经远离数字彩,重点研究足球篮球比赛资料库和赛果预测. 这是一篇在草稿箱保存了1年多的文章,一直没发现,顺便修改修改分享给大家.以后会有更多 ...
- NSIS使用教程(安装包制作安装文件教程,如何封装打包文件) 中文版
nsis中文版(Nullsoft Scriptable Install System)是一个专业的开源的可以用来封闭Windows程序的实用工具,是一个开源的 Windows 系统下安装程序制作程序. ...
- Android悬浮窗口的实现
效果图:(悬浮框可拖动) 在项目开发中有一个需求:弹出悬浮窗后,响应悬浮窗的事件再弹出对话框,但是对话框怎么也不显示.也就是说在弹出悬浮框的同时,不能再弹出对话框,可能的原因: 1.悬浮框的焦点在最前 ...
- 构建 iOS 风格移动 Web 应用程序的8款开发框架
使用 HTML5,CSS3 和 JavaScript 开发移动应用经过实践证明是一种可行的方式.这里收录了几款 iOS 风格的手机应用程序开发框架,帮助您使用擅长的 Web 技术来开发移动应用程序.这 ...
- NET中验证控件表达式汇总
ASP.NET为开发人员提供了一整套完整的服务器控件来验证用户输入的信息是否有效.这些控件如下: 1.RequiredFieldValidator:验证一个必填字段,如果这个字段没填,那么,将不能提交 ...
- [SDK2.2]Windows Azure Virtual Network (5) 重启、关闭、开启VNet中Virtual Machine
<Windows Azure Platform 系列文章目录> 我们知道,Windows Azure VM的IP分为以下两种:Internal IP Address和Public VIP ...
- redis学习之三配置文件redis.conf 的含义
摘自http://www.runoob.com/redis/redis-conf.html 安装redis之后的第一件事,我就开始配置密码,结果总是不生效,而我居然还没想到原因.今天突然用命令行设置了 ...
- 22套精致的用户界面 PSD 源文件素材《免费下载》
在这里,我们给大家分享一组精美的 PSD 源文件素材,可以免费下载使用.PSD 素材是很好的资源,对于每个设计师都非常有用,这是设计师之所以不断发布新的和有用的 PSD 文件的原因.高品质的 PSD ...
- ClojureScript魔法堂:搭建开发环境
一.前言 当看到Lisp等函数式编程语言的语法是 (say (concat "hello" "world")) 这样的时候,我就有种深入学习的冲动,因为它的语法 ...