Objects

對象兩種創(chuàng)建方式
var myObj = {
    key: value
    // ...
};
// The constructed form looks like this:
var myObj = new Object();
myObj.key = value;

本質(zhì)上沒有任何區(qū)別葬燎,一般都使用字面值

built-ins object are function

String
Number
Boolean
Object
Function
Array
Date
RegExp
Error

typeof String === "function"
typeof Object === "function"

function 是 object 的子類型

屬性名是字符串
var myObject = { };

myObject[true] = "foo";
myObject[3] = "bar";
myObject[myObject] = "baz";

myObject["true"];               // "foo"
myObject["3"];                  // "bar"
myObject["[object Object]"];    // "baz"
var a= [1,2,3]
a[1] // 2
a["1"] // 2
ES6 adds computed property names
var prefix = "foo";

var myObject = {
    [prefix + "bar"]: "hello",
    [prefix + "baz"]: "world"
};

myObject["foobar"]; // hello
myObject["foobaz"]; // world
Property Descriptors (ES5 later)
var myObject = {
    a: 2
};

Object.getOwnPropertyDescriptor( myObject, "a" );
// {
//    value: 2,
//    writable: true,
//    enumerable: true,
//    configurable: true
// }

定義屬性

var myObject = {};

Object.defineProperty( myObject, "a", {
    value: 2,
    writable: true,
    configurable: true,
    enumerable: true
} );

myObject.a; // 2
Writable 是否可以改變屬性的值
var myObject = {};

Object.defineProperty( myObject, "a", {
    value: 2,
    writable: false, // not writable!
    configurable: true,
    enumerable: true
} );

myObject.a = 3;

myObject.a; // 2

嚴格模式下會直接報錯

"use strict";

var myObject = {};

Object.defineProperty( myObject, "a", {
    value: 2,
    writable: false, // not writable!
    configurable: true,
    enumerable: true
} );

myObject.a = 3; // TypeError
Configurable 是否可配置
var myObject = {
    a: 2
};

myObject.a = 3;
myObject.a;                 // 3

Object.defineProperty( myObject, "a", {
    value: 4,
    writable: true,
    configurable: false,    // not configurable!
    enumerable: true
} );

myObject.a;                 // 4
myObject.a = 5;
myObject.a;                 // 5

Object.defineProperty( myObject, "a", {
    value: 6,
    writable: true,
    configurable: true,
    enumerable: true
} ); // TypeError
configurable:false 的屬性不能 delete
var myObject = {
    a: 2
};

myObject.a;             // 2
delete myObject.a;
myObject.a;             // undefined

Object.defineProperty( myObject, "a", {
    value: 2,
    writable: true,
    configurable: false,
    enumerable: true
} );

myObject.a;             // 2
delete myObject.a;
myObject.a;             // 2
Object Constant
var myObject = {};

Object.defineProperty( myObject, "FAVORITE_NUMBER", {
    value: 42,
    writable: false,
    configurable: false
} );

By combining writable:false and configurable:false, you can essentially create a constant (cannot be changed, redefined or deleted) as an object property

Prevent Extensions 阻止添加新屬性
var myObject = {
    a: 2
};

Object.preventExtensions( myObject );

myObject.b = 3;
myObject.b; // undefined
Seal

not only object.preventExtensions(..) on it, but also marks all its existing properties as
configurable:false.

Freeze

seal + writable:false

get and setter
get and setter
var myObject = {
    // define a getter for `a`
    get a() {
        return 2;
    }
};

Object.defineProperty(
    myObject,   // target
    "b",        // property name
    {           // descriptor
        // define a getter for `b`
        get: function(){ return this.a * 2 },

        // make sure `b` shows up as an object property
        enumerable: true
    }
);

myObject.a; // 2

myObject.b; // 4
var myObject = {
    // define a getter for `a`
    get a() {
        return this._a_;
    },

    // define a setter for `a`
    set a(val) {
        this._a_ = val * 2;
    }
};

myObject.a = 2;

myObject.a; // 4
Existence 判斷屬性是否存在
var myObject = {
    a: 2
};
("a" in myObject);              // true    看原型鏈
("b" in myObject);              // false

myObject.hasOwnProperty( "a" ); // true    只看自己状知,不看原型鏈
myObject.hasOwnProperty( "b" ); // false

in 會查找原型鏈蹬耘, hasOwnProperty 只查找對象本身

Enumeration 屬性是否可遍歷
var myObject = { };

Object.defineProperty(
    myObject,
    "a",
    // make `a` enumerable, as normal
    { enumerable: true, value: 2 }
);

Object.defineProperty(
    myObject,
    "b",
    // make `b` NON-enumerable
    { enumerable: false, value: 3 }
);

myObject.b; // 3
("b" in myObject); // true
myObject.hasOwnProperty( "b" ); // true

// .......

for (var k in myObject) {
    console.log( k, myObject[k] );
}
// "a" 2
var myObject = { };

Object.defineProperty(
    myObject,
    "a",
    // make `a` enumerable, as normal
    { enumerable: true, value: 2 }
);

Object.defineProperty(
    myObject,
    "b",
    // make `b` non-enumerable
    { enumerable: false, value: 3 }
);

myObject.propertyIsEnumerable( "a" ); // true
myObject.propertyIsEnumerable( "b" ); // false

// 下面只看本對象卖宠,不看原型鏈
Object.keys( myObject ); // ["a"]    
Object.getOwnPropertyNames( myObject ); // ["a", "b"]
Iteration 循環(huán)

for in 也會遍歷原型鏈上的屬性孕荠,所以數(shù)組一般用傳統(tǒng) index 的方式遍歷

var myArray = [1, 2, 3];

for (var i = 0; i < myArray.length; i++) {
    console.log( myArray[i] );
}
// 1 2 3

ES6 有 for of 可以直接變量值

var myArray = [ 1, 2, 3 ];

for (var v of myArray) {
    console.log( v );
}
// 1
// 2
// 3

只要有 @@iterator 屬性的對象都可以用 for of 變量宦搬, 實現(xiàn) next 方法得到下一個值

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() {
                return {
                    value: o[ks[idx++]],
                    done: (idx > ks.length)
                };
            }
        };
    }
} );

// iterate `myObject` manually
var it = myObject[Symbol.iterator]();
it.next(); // { value:2, done:false }
it.next(); // { value:3, done:false }
it.next(); // { value:undefined, done:true }

// iterate `myObject` with `for..of`
for (var v of myObject) {
    console.log( v );
}
// 2
// 3

or like this :
var myObject = { a:2, b:3, [Symbol.iterator]: function(){ /* .. */ } }

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沈自,一起剝皮案震驚了整個濱河市邻奠,隨后出現(xiàn)的幾起案子笤喳,更是在濱河造成了極大的恐慌,老刑警劉巖碌宴,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杀狡,死亡現(xiàn)場離奇詭異,居然都是意外死亡贰镣,警方通過查閱死者的電腦和手機呜象,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來八孝,“玉大人董朝,你說我怎么就攤上這事「甚耍” “怎么了子姜?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長楼入。 經(jīng)常有香客問我哥捕,道長,這世上最難降的妖魔是什么嘉熊? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任遥赚,我火速辦了婚禮,結(jié)果婚禮上阐肤,老公的妹妹穿的比我還像新娘凫佛。我一直安慰自己讲坎,他們只是感情好,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布愧薛。 她就那樣靜靜地躺著晨炕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪毫炉。 梳的紋絲不亂的頭發(fā)上瓮栗,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天,我揣著相機與錄音瞄勾,去河邊找鬼费奸。 笑死,一個胖子當著我的面吹牛进陡,可吹牛的內(nèi)容都是我干的愿阐。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼四濒,長吁一口氣:“原來是場噩夢啊……” “哼换况!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起盗蟆,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎舒裤,沒想到半個月后喳资,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡腾供,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年仆邓,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伴鳖。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡节值,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出榜聂,到底是詐尸還是另有隱情搞疗,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布须肆,位于F島的核電站匿乃,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏豌汇。R本人自食惡果不足惜幢炸,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拒贱。 院中可真熱鬧宛徊,春花似錦佛嬉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至号枕,卻和暖如春缰揪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背葱淳。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工钝腺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赞厕。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓艳狐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親皿桑。 傳聞我的和親對象是個殘疾皇子毫目,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容