★07.属性

简介

  • 属性名可以是包含空字符串在内的任意字符串,但对象中不能存在两个同名的属性。
  • 值可以是任意 JavaScript 值,从 ES 5 开始也可以是gettersetter函数(或者二者都有)。
  • 属性特性有以下三种:
    • 可写 :是否可以设置属性值。
    • 可枚举 :是否可以通过for/in循环返回该属性值。
    • 可配置 :是否可以删除或修改该属性。
  • ES 5 以前的所有属性都是 可写可枚举可配置 的。

属性的查询和设置

  • 属性的查询示例:
var ab = a.b;
var ac = a["c"];
  • 属性的设置示例:
a.b = 6;
a["c"] = 7;
  • 对象可以动态地创建任意数量的属性。
  • 动态创建对象属性时,通常用[]形式而不是.形式,因为.的属性名用的是标识符,而[]用的属性名师字符串。
  • 对象的 自有属性 可以覆盖 继承属性 ,但 继承属性 即使被 自有属性 覆盖,也仍然存在。
  • 对象的 自有属性 覆盖 继承属性 的示例:
var o = {r : 1};
var c = inherit(o);
c.x = 2;
c.y = 2;
c.r = 2;
o.r;                    // 仍然为1,子对象c的覆盖行为不会影响到原型的属性
  • 查询一个对象的不存在属性不会报错,会返回undefined
  • 查询一个不存在的对象的任意属性会抛出 类型错误异常
  • 确保查询的对象存在的简单示例:
var len = a && a.b && a.b.c;        // JavaScript中的&&不会将操作数转换为布尔值,同时返回的不一定是布尔值,可以是其他真值或假值
  • 一些设置属性的操作在 ES 3 中会失败,但不会报错,在 ES 5严格模式 中则报错:
    • 给只读属性赋值。
    • 使用 自有属性 覆盖只读的 继承属性
    • 给不可拓展的对象增加属性。

删除属性

  • delete只是断开属性和宿主对象的联系。
  • delete只能删除 自有属性 ,不能删除 继承属性 ,可以直接在 原型对象 上删除它。
  • delete的返回值取决于以下两点:
    • delete删除成功或没有任何副作用时,返回true
    • delete后不是一个属性访问表达式,返回true
  • delete不能删除不可配置的属性。在 严格模式 下,删除不可配置的属性会报错。
o = {x : 1};
delete o.x;             // true
delete o.y;             // true
delete o.toString;      // true
delete 1;               // true

delete Object.prototype;    // false,无法删除,属性是不可配置的
var x = 1;                  // false,不可配置
delete this.x;              // false,无法删除
function f() { }
delete this.f;              // false,不能删除全局函数

检测属性

  • in:如果对象的 自有属性继承属性 中包含这个属性就返回true
var o = {x : 1};
"x" in o;           // true
"y" in o;           // false
"toString" in o;    // true
  • hasOwnProperty():如果对象的 自有属性 中包含这个属性就返回true
var o = {x : 1};
o.hasOwnProperty("x");                  // true
o.hasOwnProperty("y");                  // false
o.hasOwnProperty("toString");           // false
  • propertyIsEnumerable():如果对象的可枚举 自有属性 中包含这个属性就返回true。通常 JavaScript 创建的属性都是可枚举的。
var o = inherit({y : 2});
o.x = 1;
o.propertyIsEnumerable("x");                        // true
o.propertyIsEnumerable("y");                        // false
Object.prototype.propertyIsEnumerable("toString");  // false

枚举属性

  • for/in循环可以用于遍历对象中所有可枚举的属性(包括 自有属性继承属性 )。
  • 对象继承的内置方法不可枚举的,但在代码中给对象添加的属性都是可枚举的。
  • ES 5 两个和枚举相关的函数:
    • Object.keys():返回一个数组,元素为对象中可枚举的 自有属性 的名称。
    • Object.getOwnPropertyNames():返回一个数组,元素为对象中 自有属性 的名称。

属性的gettersetter

  • 使用常见的键值对的方式定义的属性,称为 数据属性 。另一种通过定义gettersetter一个或两个的方式定义的属性,称为 存取器属性
  • 数据属性 一样, 存取器属性 也可以被继承。
  • 如果一个 存取器属性
    • 定义了gettersetter则是一个 读/写属性
    • 定义了getter则是一个 只读属性
    • 定义了setter则是一个 只写属性
  • 读取 只写属性 总是返回undefined
var o = {
    odata = 0;
    get data() { return odata; },             // 逗号
    set data(value) { odata = value; }
}

o.data;             // 0
o.data = 10;

属性的特性

属性描述符

简述

  • 属性描述符 是一个对象,记录了 数据属性存取器属性 的四个特性。
  • Object.getOwnPropertyDescriptor()
    • 可以用于获取某个对象的 自有属性属性描述符
    • 要想获取 继承属性属性描述符 则需要遍历原型链。
  • Object.definePeoperty()
    • 可以用于设置某个对象的 自有属性属性描述符 ,或者新建具有某种 属性描述符自有属性
    • 要想设置 继承属性属性描述符 则需要遍历原型链。
  • Object.definePeoperties()
    • Object.definePeoperty()一样,但是可以同时设置或新建多个 自有属性
    • 要想设置 继承属性属性描述符 则需要遍历原型链。
  • Object.definePeoperty()Object.definePeoperties()会在违反以下原则时抛出类型错误异常:
    • 如果对象不可拓展,那么可以编辑此对象的 自有属性 ,但是不能添加新属性。
    • 如果属性不可配置,则:
      • 不能修改 可配置性可枚举性
      • 数据属性 转换为 存取器属性 或反方向转换。
      • 可以关闭 可写性 ,但不能打开 可写性

Object.getOwnPropertyDescriptor()示例

// 返回 {value: 1, writable:true, enumerable:true, configurable:true}
Object.getOwnPropertyDescriptor({x : 1}, "x");

var random = {
    get octet() { return Math.floor(Math.random() * 256); }
};

// 返回 { get: /*func*/, set:undefined, enumerable:true, configurable:true}
Object.getOwnPropertyDescriptor(random, "octet");

Object.getOwnPropertyDescriptor({}, "x"); // undefined
Object.getOwnPropertyDescriptor({}, "toString"); // undefined

Object.definePeoperty()示例

var o = {};

// 定义属性o.x
Object.defineProperty(o, "x", {
    value : 1,
    writable : true,
    enumerable : false,
    configurable : true
});

// 设置o.x为不可写
Object.defineProperty(o, "x", {writable : false});

// o.x虽然不可写,但是仍然可配置,所以可以通过这种方式修改值
Object.defineProperty(o, "x", {value : 2});

// 可以将数据属性修改为存取器属性
Object.defineProperty(o, "x", {
    get : function () { return 0; }
});

Object.definePeoperties()示例

var p = Object.defineProperties({}, {
    x : {value : 1, writable : true, enumerable : true, configurable : true},
    y : {value : 1, writable : true, enumerable : true, configurable : true},
    r : {
        get : function () {
            return Math.sqrt(this.x * this.x + this.y * this.y)
        },
        enumerable : true,
        configurable : true
    }
});

数据属性

  • 数据属性 包含以下四个特性:
    • value
    • writable可写性
    • enumerable可枚举性
    • configurable可配置性

存取器属性

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

推荐阅读更多精彩内容