对象

1.对象字面量
用来创建新对象值,位置不限,包含多个“名值”对

var empty_object = {};
var stooge = {
    "first-name" : "zhang",
    "last-name" : "fei"
}

属性名称如果是一个合法的JS标识符且不是保留字
我们可以不用引号将属性包起来
但是像first-name这种就必须用引号了

var flight = {
    airline : "BeiJing",
    number : 212,
    departure : {
        IATA : "GZ",
        time : "2000-12-12 10:00",
        city : "GuangZhou"
    },
    arrival : {
        IATA : "SH",
        time : "2000-12-12 22:40",
        city : "ShangHai"
    }
}

2.检索
使用[]的访问被“”包含的字符串属性

alert(stooge['first-name']);    // zhang
alert(flight['number']);        // 212

使用.访问合法的JS表示符表示的属性,优先使用

alert(flight.number);       // 212
alert(stooge.first-name);       //NaN

如果访问一个不存在的属性,那么返回undefined

alert(flight.price);        // undefined

可以用||填充默认值

var price = flight.price || "$100";
alert(price);       // $100

访问undefined的属性会抛出TypeError异常,可以使用&&屏蔽错误

alert(alert(flight.price));     // undefined
alert(flight.price.cheap);  // 抛出异常
alert(flight.price && flight.price.cheap);      // undefined

3.更新
对于对象中存在的属性,可以直接通过赋值修改

stooge["first-name"] = "li";
alert(stooge["first-name"]);    // li

对于对象中不存在的属性,直接扩充到对象中

stooge["middle-name"] = "xiao";
alert(stooge["middle-name"]);   // xiao

4.引用
对象通过引用来传递,从来不会被拷贝

var zhang = stooge;
zhang.nickname = "tom";
alert(stooge.nickname);     // tom
// zhang和stooge引用同一个对象,只是两个不同的指针
var a = {}, b = {}, c = {};
// 引用三个不同的对象
a = b = c = {};
// 引用一个对象

5.原型
每个对象都连接一个原型,可以继承原型中的属性
所有的通过对象字面量创建的对象都连接到Object.prototype这个标准的JS原型
当你创建对象时,可以选择某个对象作为它自己的原型

if (! typeof Object.beget != "function") {
    Object.beget = function (o) {
        var F = function () {};
        F.prototype = o;
        return new F();
    }
}
var another_stooge = Object.beget(stooge);
alert(another_stooge['first-name']);    // zhang
alert(another_stooge['last-name']);     // fei

委派的过程:查找对象的属性 –> 查找原型对象的属性 –> 查找原型的属性 …–> Object.prototype中去
例如查找another_stooge的’first-name’的属性值,首先从该对象开始,然后去原型对象stooge中,找到了
如果没有找到,继续到原型中找,一直找到Object.prototype中,如果没有,则返回undefined
6.反射
检测对象有什么类型的属性很容易,用typeof

alert(typeof stooge['first-name']);     // string
alert(typeof flight.number);            // number

原型链中的任意一个属性都会返回一个值

alert(typeof flight.constructor);       // function 
alert(typeof flight.toString);          // function 
alert(typeof Object.beget);                 // function 
function Person () {
    this.name = "zhang";
}
Person.prototype.getName = function () {
    return this.name;
}
var p = new Person();
alert(typeof p.name);       // string
alert(typeof p.getName);    // function

处理不需要的属性,用hasOwnProperty,如果实例对象有属性返回true,否则返回false。它不会检查原型链属性

var p = new Person();
p.name = "li";
alert(p.hasOwnProperty("name"));    // true

7.枚举
for in语句遍历对象的所有属性,包含函数或者原型中的你可能不关心的属性

for(var s in flight) {
    if(typeof flight[s] !== "function") {
        // airline = BeiJing number = 212 departure = [object Object] arrival = [object Object] 
        document.writeln(s + " = " + flight[s]);
    }
}

按照特定的顺序返回,那么可以将数组和for循环结合起来实现

var index = ["arrival", "airline", "departure", "number"],
    i, len;
for(i = 0, len = index.length; i < len; i++) {
    // arrival = [object Object] airline = BeiJing departure = [object Object] number = 212 
    document.writeln(index[i] + " = " + flight[index[i]]);
}

8.删除
delete可以删除对象中的属性,但是它不会触发原型链中的任何对象
delete删除对象中的属性,可以把原型中的值显示出来

another_stooge['first-name'] = "li";
alert(another_stooge['first-name']);    // li
delete another_stooge['first-name'];
alert(another_stooge['first-name']);    // zhang

9.减少全局污染
将你的应用程序全部打包到一个唯一的全局变量中

var MYAPP = {};
MYAPP.stooge = {
    "first-name" : "zhang",
    "last-name" : "fei"
}
MYAPP.flight = {
    airline : "BeiJing",
    number : 212,
    departure : {
        IATA : "GZ",
        time : "2000-12-12 10:00",
        city : "GuangZhou"
    },
    arrival : {
        IATA : "SH",
        time : "2000-12-12 22:40",
        city : "ShangHai"
    }
};
alert(MYAPP.stooge['first-name']);// zhang
alert(MYAPP.flight.number);     // 212
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容