对象--js权威指南笔记

原型

创建新对象
Object.create(Object.prototype);
属性查询和设置
通过"."或方括号来获取属性的值,值得注意的是使用方括号时里面的值是以属性命名的字符串,用方括号有点类似于数组。

   var age=mianmian["age"];     //获取年龄属性;
   var age=mianmian.age;
继承
 先看一小段代码
  
   var o={};
    o.x=1;
   var p=inherit(o);
   var q=inherit(p);
   console.log(q.x);            //1;

发现什么 了没有,就是在查找继承的时候是从下往上一层一层的查找原型的,当找到x时即返回值,停止。对象的原型属性就像一个“链”,这个链实现 属性的继承。
在js中,只有在查询属性的时候才会体会到继承的存在,而设置属性与继承无关无法通过继承的属性值的改变来改变原型的值;

   var o={};
    o.x=3;
    var m=inherit(o);

  function inherit(p) {        //继承函数
    if(p==null) throw TypeError();
    if(Object.create) return Object.create(p);
    var t=typeof p;
    if(t!=="object"&&t!=="function") throw TypeError();
  function f() {};
  f.prototype=p;
  return new f();
}
  m.x=9;
  console.log(o.x);         //3,未改变原始值
删除属性

delete只能删除自有属性,不能删除继承属性,要删除继承属性必须从定义这个属性的原型对象上删除它,而且会影响所有继承自这个原型的对象

       function Mianmian(name,age) {
  this.name=name;
   this.age=age;
    }
Mianmian.prototype={
      sum:function(a,b) {
       return a+b;
     },
    divide:function(a,b) {
       return a/b;
      }
 };

 var mianmian=new Mianmian("xiaomian",19);
 delete(Mianmian.prototype.sum);          //删除原型属性
 console.log(mianmian.sum)     //undefined,,继承对象的属性随之改变
检测属性

in :如果对象的自有属性或继承属性中包含这个属性就返回true

  var o={x:1};
  "x" in o;      //true
  "toString" in o;        //true

hasOwnproperty检测给定名字是否为对象的自有属性,对于继承属性返回false
propertyIsEnumerable检测是自有属性并且这个属性可枚举时才返回true
还有一个是!==判断一个属性是否为undefined,如果为undefined的话就返回false,这样的话使用跟in有点相似,但是呢,如果一个对象的值为undefined的话就会出现差异。

  var m={a:undefined};
 console.log(m.a in m);   //false
 console.log("a" in m);     //true
 console.log(m.a!==undefined);    //false
 console.log("a"!==undefined)       //true
枚举属性

for/in 循环可在循环中遍历对象中可枚举的属性,包括自有属性和继承属性。对象中的内置方法是不可枚举的,但在代码中添加的属性是可枚举的。为了避免枚举一些不可用参数,可以用

    var m={x:2,y:{a:1,b:2}};
    for(var p in m)
   {
    if(!m.hasOwnProperty(p)||typeof m[p]==="function")continue;    //除去继承属性和方法
    console.log(p);
   }

属性getter和setter
不是很会。待补充

属性的特性:

value,writable(可写性),enumerable(可枚举性),configurable(可配置性)
要想设置属性的特性,或者想让新建属性具有某种特性,需要调用Object.defineproperty(),传入要修改的对象,要创建或修改的属性名称以及属性描述符对象

   var o={};
  Object.defineProperty(o,"x",{value:1
                         writable:true,
                         enumerable:false,
                         configurable:true});
  console.log(o.x);     //1
  Object.defineProperty(o,"x",{writable:false});
   o.x=2;               //操作失败
   console.log(o.x);    //1

可配置的意思就是你还可以通过以下的方式改变值

    Object.defineProperty(o,"x",{value:2});
    console.log(o.x);      //2

如果不可配置的话就会是这样

  var p=Object.defineProperties({},{
    x:{value:1,writable:false,enumerable:true,configurable:false},
    y:{value:8,writable:false,enumerable:true,configurable:true}
  });      
  Object.defineProperty(p,"x",{value:8});        //报错

对于新创建的属性来说,默认的特性值是false或undefined,这个方法要么修改已有属性要么新建自有属性,但不会改变继承属性。
通过Object.defineProperties()可同时修改或创建多个属性,就像包含多个小对象一样,如:

   var p=Object.defineProperties({},{
    x:{value:1,writable:true,enumerable:true,configurable:true},
    y:{value:8,writable:false,enumerable:true,configurable:true}
});
    p.x=9
    console.log(p.x);        //9
    p.y=3;
    console.log(p.y)        //8
可拓展性

一般来说,所有的内置对象和自定义对象都是可拓展的,但是可以通过Object.preventExtensions()Object.seal()将其设置为不可拓展的,但是一旦转为不可拓展就不能再转换为可拓展的了,Object.esExtensible()检测对象是否可拓展,seal()检测对象是否封闭

比较:

1 .

    var o={x:1,y:3};
    Object.seal(o);
    o.a=1;
    console.log(Object.isSealed(o));              //true

2 .

    var o={x:1,y:3};
    Object.preventExtensions(o);
    o.x=2;                                                     //2
    console.log(Object.isExtensible(o));        //false

3 .

   var o={x:1,y:3};
    Object.seal(o);
    o.a=1;
    console.log(Object.isExtensible(o));       // false

4 .

    var o={x:1,y:3};
    Object.preventExtensions(o);
    o.a=1;
    console.log(Object.isSealed(o));        //false

这说明Object.seal()是比Object.preventExtensions()更严格的锁定对象,并且他们都可以修改原先属性中的值,暂时还没了解到其中的区别,另外还有一个Object.freeze()函数则是更更严格的锁定对象,他连属性中的值都不能改变

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容