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 ...
随机推荐
- SQL*Loader之CASE7
CASE7 1. SQL脚本 case7包含两个SQL脚本,一个是删除脚本ulcase7e.sql,一个是创建脚本ulcase7s.sql [oracle@node3 ulcase]$ cat ulc ...
- SQL SERVER 内存分配及常见内存问题 简介
一.问题: 1.SQL Server 所占用内存数量从启动以后就不断地增加: 首先,作为成熟的产品,内存溢出的机会微乎其微.对此要了解SQL SERVER与windows是如何协调.共享内存.并且SQ ...
- HT for Web基于HTML5的图像操作(二)
上篇介绍了HT for Web采用HTML5 Canvas的getImageData和setImageData函数,通过颜色乘积实现的染色效果,本文将再次介绍另一种更为高效的实现方式,当然要实现的功能 ...
- linux专题三之如何悄悄破解root密码(以redhat7.2x64为例)
root用户在linux系统中拥有至高无上的权限.掌握了root密码,差不对可以对linux系统随心所欲了,当然了,root用户也不是权限最高的用户. 但是掌握了root密码,基本上够我们用了.本文将 ...
- libqxt编译
一.说明 编译环境:win10.qt5.6.1-1.vs2013和libqxt源码(从git上下载) libqxt:libqxt 关于libqxt的说明,请到libqxt的官网阅读,说着看图1,图1是 ...
- 用redux构建购物车
很久没更新博客了,最近要用到react,再来跟大家分享一个redux案例吧. [ {"id": 1, "title": "iPad 4 Mini&qu ...
- 解决MVC EF Code First错误:Model compatibility cannot be checked because the EdmMetadata type was not included in the model.
Model compatibility cannot be checked because the EdmMetadata type was not included in the model. En ...
- 改进网站设计的免费jQuery插件Top 7
Animate Scroll.js是一个简单的jQuery插件,它用来为滚动增加延迟效果.同时你还可以自定义滚动样式(30多种滚动效果)和滚动速度,还有一个可以操纵”滚动结束位置”的”padding” ...
- WPF DataGrid绑定及列居中
基本的数据绑定 把集合的字段(属性)绑定在DataGrid的Binding属性就能将数据绑定列表 public class CashItem { public int Value { get; set ...
- Android ADB 命令大全
1 cpu号: 文件在: /proc/cpuinfo 通过Adb shell 查看: adb shell cat /proc/cpuinfo 2 mac 地址 文件路径 /sys/class/net/ ...