对象

对象

对象可以通过两种形式定义: 声明形式和构造形式

声明形式语法: var myObj = {key:value}

构造形式语法: var myObj = new Object(); myObj.key = value;

类型: 语言类型有六种 : string number boolean null undefined object

内置对象: String Number Boolean Object Function Array Date RegExp Error

var myObject = {

a:2

}

myObject.a; //2 属性访问

myObject["a"] // 2 键访问

ES6 可计算属性名

var prefix = "foo";

var myObject = {

[prefix + "bar"] : "hello",

};

myObject["foobar"]; // hello

myObject["foobaz"]; // world

1.writable 决定是否可以修改属性的值

var myObject = {};

Object.defineProperty(myObject,"a",{

value:2,

writable:false, // 不可写!

configurable: true,

enumerable: true

});

myObject.a = 3;

myObject.a; // 2

2.configurable

只要属性是可配置的,就可以使用defineProperty(..) 方法来修改描述属性。

var myObject = {

a : 2

};

myObject.a = 3;

myObject.a; // 3

Object.defineProperty(myObject,"a",{

value: 4,

writable:true,

configurable:false,// 不可配置

enumerable: ture

});

myObject.a; // 4

myObject.a = 5;

myObject.a; // 5

Object.defineProperty(myObject,"a",{

value: 6,

writable:true,

configurable:true,

enumerable: ture

}) // TypeError

configurable 修改成flash 是单向的,无法撤销

delete只用来删除对象的可删除属性。

var myObject = {

a:2

};

myObject.a //2

delete myObject.a;

myObject.a // undefined

3.enumerable 控制的是属性是否出现在对象的属性枚举中。

1.对象常量,结合writable: false 和configurable: false 就可以创建一个真正的常量属性

(不可修改,重定义或者删除)。

var myObject = {};

Object.defineProperty(myObject,"FAVORITE_NUMBER",{

value:42,

writable: false,

configurable: false

})

2.禁止扩展

禁止一个对象添加新属性并保留已有属性,可以使用Object.preventExtensions(...)

var myObject = {

a:2

};

Object.preventExtensions(myObject);

myObject.b = 3;

myObject.a; // undefined

3.封存

Object.seal(...) 会创建一个 “封存的对象”,这个方法实际上会在一个现有对象上调用

Object.preventExtensions(...) 并把所有属性标记为configurable:false.

4.冻结

Object.freeze(...) 会创建一个冻结对象,这个方法实际上是会在一个现有对象上调用

Object.seal(...) ,还可以深度冻结一个对象。

Getter和Setter

var myObject = {

// 给 a 定义一个getter

get a() {

return 2;

}

}

myObject.a = 3;

myObject.a; // 2

由于只定义了 a 的getter,所以对a 的值进行设置时set 操作会忽略赋值操作,不会抛出错误。

通常来讲getter 和setter是成对出现的

var myObject = {

// 给 a 定义一个getter

get a() {

return this.a;

},

// 给 a 定义一个setter

set a(val) {

this.a = val * 2;

}

};

myObject.a = 2;

myObject.a; // 2

存在性

可以在不访问属性的情况下判断对象中是否存在这个属性:

var myObject = {

a:2

};

("a" in myObject); // true

("b" in myObject); // false

myObject.hasOWnProper("a"); // true

myObject.hasOwnProperty("b"); // false

in 操作符会检查属性是否在对象及[[Prototype]]原型链中。

hasOwnProperty(...) 只会检查属性是否在myObject对象中。

判断属性是否可枚举:

var myObject = {};

Object.defineProperty(

myObject,

"a",

// 让a像普通属性一样可枚举

{enumerable: true,value:2}

);

Object.defineProperty(

myObject,

"b",

// 让b 不可枚举

{enumerable: false,value:3}

)

myObject.propertyIsEnumberable("a"); // true

myObject.propertyIsEnumber("b"); // false

Object.keys(myObject); // ["a"]

Object.getOwnPropertyName(myObject); // ["a","b"]

propertyIsEnumerable(...) 会检查给定的属性名是否直接存在于对象中(而不是在原型链)并且满足enumerable:true

Object.keys(...) 会返回一个数组,包含所有可枚举属性

Object.getOwnPropertyNames(...) 返回一个数组,包含所有属性,无论是否可枚举

遍历

for .. in 可以用来遍历对象的可枚举属性列表

对于数值索引的数组来说,可以使用标准的for 循环

ES5 中新增的 forEach(..) every(...) some(..)

forEach(...) 会遍历数组中所有值并忽略回调函数的的返回值。

every(...) 会一直运行到回调函数返回false

some(...) 会一直运行到回调函数返回true

Es6 增加 for .. of 循环语法

var myArray = [ 1,2,3];

for(var v of myArray){

console.log(v)

}

普通的对象没有@@iterator,可以给任何想遍历的对象自定义

var myObject = {

a:2,

b:3

};

Object.defineProperty(myObject,Symbol.iterator,{

enumerable: false,

writable: false,

configurable: true,

value: function() {

var o = this;

var idx = 0;

var ks = Object.keys(o);

return {

next: function(){

value: o[ks[idx++]],

done:(idx > ks.length)

}

}

}

})

// 手动遍历myObject

var it = myObjectSymbol.iterator;

it.next(); // {value:2,done: false}

it.next(); // {value:3,done: false}

it.next(); // {undefined,done: true}

// 用 for..of 遍历myObject

for(var v of myObject){

console.log(v)

} // 2 // 3

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容