`

JavaScript深入浅出学习笔记(四)—对象

阅读更多

        对象中包含一系列属性,这些属性是无序的。每个属性都有一个字符串key和对应的value。

var obj = {};
obj[1] = 1;
obj['1'] = 2;
obj;//Object{1:2}

obj[{}] = true;
obj[{x:1}] = true;
obj;//Object{1:2,[object Object]:true}

 

一.创建对象

1.字面量

var obj1 = {x:1,y:2};
var obj2 = {
     x:1,
     y:2,
     o: {
         z:3,
         n:4
     }
};

2.new/原型链

function foo() {}
foo.prototype.z = 3;

var obj = new foo();
obj.y=2;
obj.x=1;

obj.x;//1
obj.y;//2
obj.z;//3
typeof obj.toString;//'function'
'z' in obj;//true
obj.hasOwnProperty('z');//false

obj.z = 5;
obj.hasOwnProperty('z');//true
foo.prototype.z;//still 3
obj.z;//5

obj.z = undefined;
obj.z;//undefined

delete obj.z;//true
obj.z;//3

3.Object.create

var obj = Object.create({x:1});
obj.x;//1
typeof obj.toString;//"function"
obj.hasOwnProperty('x');//false

var obj = Object.create(null);
obj.toString;//undefined

 

二.属性操作

1.读写对象属性

var obj = {x:1,y:2};
obj.x;//1
obj["y"];//2

var obj = {x1:1,x2:2};
var i=1,n=2;
for(;i<=n;i++) {
     console.log(obj['x'+i]);
}
//输出:1,2

var p;
for(p in obj) {
     console.log(obj[p]);
}

2.属性读写-异常

var obj = {x:1};
obj.y;//undefined
var yz=obj.y.z;//TypeError:Cannot read property 'z' of undefined
obj.y.z=2;//TypeError:Cannot set property 'z' of undefined

var yz;
if(obj.y) {
   yz = obj.y.z;
}
var yz = obj && obj.y && obj.y.z;

3.删除属性

var person = {age:28,title:'fe'};
delete person.age;//true
delete person['title'];//true
person.age;//undefined
delete person.age;//true

delete Object.prototype;//false

var descriptor = Object.getOwnPropertyDescriptor(Object, 'prototype');//获得Object对象的prototype属性描述器
descriptor.configurable;//false

var定义的全局变量或局部变量,不能被删除。

 

var globalVal = 1;
delete globalVar;//false

(function() {
     var localVal = 1;
     return delete localVal;
}());//false

function fd(){}
delete fd;//false

(function() {
    function fd() {};
    return delete fd;
}()); //false

ohNo = 1;
window.ohNo;//1
delete ohNo;//true

 

4.检测属性

var cat = new Object;
cat.legs = 4;
cat.name = "Kitty";

'legs' in cat;//true
'abc' in cat;//false
"toString" in cat;//true,inherited property!!!

cat.hasOwnProperty('legs');//true
cat.hasOwnProperty('toString');//false

cat.propertyIsEnumerable('legs');//true
cat.propertyIsEnumerable('toString');//false
自定义属性,可以让其枚举为false,可用Object.defineProperty
//自定义属性,可以让其枚举为false
Object.defineProperty(cat, 'price', {enumerable:false, value:1000});
cat.propertyIsEnumerable('price');//false
cat.hasOwnProperty('price');//true

if(cat && cat.legs) {
     cat.legs *= 2;
}

if(cat.legs != undefined) {
    //!==undefined  or !== null
}

if(cat.legs !== undefined) {
     //only if cat.legs is not undefined
}

5.枚举属性

var o = {x:1,y:2,z:3};
'toString' in o;//true
o.propertyIsEnumerable('toString');//false
var key;
for(key in o) {
    console.log(key);//x,y,z
}

var obj = Object.create(o);
obj.a = 4;
var key;
for(key in obj) {
    console.log(key);//a,x,y,z
}

var obj = Object.create(o);
obj.a = 4;
var key;
for(key in obj) {
    if(obj.hasOwnProperty(key)) {
          console.log(key);//a
    }
}

 

三.get/set方法

var man = {
    name:'Bosn',
    weibo:'@Bosn',
    get age() {
          return new Date().getFullYear()-1988;
    },
    set age(val) {
          console.log('Age can\'t be set to '+val);
    }
}
console.log(man.age);//27
man.age = 100;//Age can't be set to 100
console.log(man.age);//still 27

 

var man = {
     weibo:'@Bosn',
     $age:null,
     get age() {
           if(this.$age == undefined) {
                return new Date().getFullYear() - 1988;
            }else {
                return this.$age;
            }
      },
      set age(val) {
            val =+val;
            if(!isNaN(val) && val > 0 && val < 150) {
                  this.$age =+ val;
            }else {
                  throw new Error('Incorrect val = ' + val);
            }
       }
}
console.log(man.age);//27
man.age = 100;
console.log(man.age);//100
man.age='abc';//error:Incorrect val = NaN
get/set与原型链
function foo() {}
Object.defineProperty(foo.prototype, 'z', {get:function() {return 1;}});
var obj = new foo();
obj.z;//1
obj.z = 10;
obj.z; //still 1

Object.defineProperty(obj, 'z', {value:100, configurable:true});
obj.z;//100
delete obj.z;
obj.z;//back to 1

 

var o = {};
Object.defineProperty(o, 'x', {value:1});//writable=false,configurable=false
var obj = Object.create(o);
obj.x;//1
obj.x = 200;
obj.x;//still 1, can't change it

Object.defineProperty(obj, 'x', {writable:true, configurable:true, value:100});
obj.x;//100
obj.x = 500;
obj.x;//500

 

四.属性标签

//Object.getOwnPropertyDescriptor方法第一个参数是要判断的对象,第二个参数是要判断的属性名
Object.getOwnPropertyDescriptor({pro:true}, 'pro');
//Object {value:true, writable:true, enumerable:true,configurable:true}
Object.getOwnPropertyDescriptor({pro:true}, 'a');//undefined

var person = {};
Object.defineProperty(person, 'name', {
     configurable:false,
     writable:false,
     enumerable:true,
     value:"Bosn Ma"
});

person.name;//Bosn Ma
person.name = 1;
person.name;//still Bosn Ma
delete person.name;//false

Object.defineProperty(person, 'type', {
   configurable: true,
   writable:true,
   enumerable:false,
   value:"Object"
});
Object.keys(person);//["name"],因为type属性的enumerable为false

writable:表示这个属性是否可以被修改或可写

enumeralbe:表示这个属性是否可以被枚举

configurable:表示这个属性是否可以再被修改,是否可以用delete删除

Object.defineProperties(person, {
     title: {value:'fe', enumeralbe: true},
     corp: {value: 'BABA', enumerable:true},
     salary: {value:50000, enumeralbe:true, writable:true},
     luck: {
        get:function() {
            return Math.random()>0.5 ? 'good':'bad';
        }
      },
      promote: {
         set: function(level) {
             this.salary *= 1 + level*0.1;
         }
      }
});

Object.getOwnPropertyDescriptor(person, 'salary');
//Object {value:50000,writable:true,enumerable:true,configurable:false}
Object.getOwnPropertyDescriptor(person, 'corp');
//Object {value:"BABA",writable:false,enumerable:true,configurable:false}

person.salary;//50000
person.promote=2;
person.salary;//60000

 

五.对象标签、对象序列化

1.原型标签_proto_

2.class标签

var toString = Object.prototype.toString;
function getType(o) {return toString.call(o).slice(8,-1);};
toString.call(null);//"[object Null]"
getType(null); //"Null"
getType(undefined);//"Undefined"
getType(1);//"Number"
getType(new Number(1));//"Number"
typeof new Number(1);//"object"
getType(true);//"Boolean"
getType(new Boolean(true));//"Boolean"

3.extensible标签:对象是否可扩展

 

var obj = {x:1, y:2};
Object.isExtensible(obj);//true
Object.preventExtensions(obj);
Object.isExtensible(obj);//false
obj.z = 1;
obj.z;//undefined,add new property failed
Object.getOwnPropertyDescriptor(obj, 'x');
//Object {value:1, writable:true, enumeralbe:true, configurable:true}

Object.seal(obj);//Object.seal方法在Object.isExtensible基础上又增加了一条限制,将对象上所有属性的configurable设置为false
Object.getOwnPropertyDescriptor(obj, 'x');
//Object {value:1, writable:true, enumerable:true, configurable:false}
Object.isSealed(obj);//true

Object.freeze(obj);//Object.freeze冻结对象,即将writable、configurable两属性设为false,不可删除、修改对象属性的值
Object.getOwnPropertyDescriptor(obj,'x');
//Object {value:1,writable:false, enumerable:true, configurable:false}
Object.isFrozen(obj);//true

//[caution] not affects prototype chain!!!不影响原型链!!!
4.序列化、其它对象方法
var obj = {x:1,y:true,z:[1,2,3],nullVal:null};
JSON.stringify(obj);//"{"x":1,"y":true,"z":"[1, 2, 3]","nullVal":null}"

//如果序列化的对象的属性是undefined时,将忽略;如果是Infinity时,将转化为null
obj = {val:undefined, a:NaN, b:Infinity, c:new Date()};
JSON.stringify(obj);//"{"a":null,"b":null,"c":"\"2015-01-28T15:22:10Z\""}"

obj = JSON.parse('{"x":1}');
obj.x;//1
自定义序列化
var obj = {
      x:1,
      y:2,
      o: {
             o1:1,
             o2:2,
             toJSON:function() {
                 return this.o1 + this.o2;
             }
       }
};
JSON.stringify(obj);//"{"x":1,"y":2,"o":3}"
其它对象方法
var obj = {x:1, y:2};
obj.toString();//"[object Object]"
obj.toString = function() {return this.x + this.y};
"Result " + obj;//"Result 3",by toString

+obj;//3,from toString

obj.valueOf = function() {return this.x + this.y + 100;};
+obj;//103, from valueOf

"Result " + obj;//"Result 103"
 
视频学习地址:http://www.imooc.com/learn/277
  • 大小: 3.7 KB
  • 大小: 11 KB
  • 大小: 71.4 KB
分享到:
评论

相关推荐

    深入浅出javascript(pdf)

    "深入浅出JavaScript"这本书显然旨在帮助读者全面理解这种强大的编程语言,包括其核心概念、语法以及实际应用。 JavaScript的基础部分涵盖变量、数据类型、控制流(如条件语句和循环)、函数等。变量是存储数据的...

    JavaScript-学习笔记.docx

    JavaScript是一种广泛应用...以上就是JavaScript学习笔记中的主要知识点,理解和掌握这些内容对于深入学习JavaScript至关重要。在实际编程中,还需要结合具体的场景灵活运用,并不断实践和探索更高级的特性和最佳实践。

    《李炎恢Javascript笔记》+源码

    《李炎恢Javascript笔记》是一本深入浅出的JavaScript学习资料,它涵盖了JavaScript的基础到实践应用的诸多方面。这本书的特点是将复杂的编程概念分解为易于理解的小知识点,并且提供了源码示例,使得读者能够更好地...

    大佬的前端学习笔记

    【标题】:“大佬的前端学习笔记”是一份深入浅出的前端开发资源,包含了Web开发中的核心语言和技术,如Node.js、JavaScript、Axios、jQuery和HTML。这份笔记旨在帮助开发者提升前端技能,掌握现代Web开发的最佳实践...

    javascript学习笔记(二)数组和对象部分

    本文是学习笔记系列的第二篇,深入浅出的分别从javascript对象和数组两个部分介绍了相关知识,并附上详细示例,非常的实用,有需要的朋友可以参考下

    张孝祥JAVASCRIPT笔记

    张孝祥是一位知名的编程教育者,他的JavaScript教程以其深入浅出的讲解方式深受广大程序员喜爱。他的笔记涵盖了JavaScript的核心概念、语法、数据类型、控制结构、函数、对象、数组、字符串、正则表达式、DOM操作、...

    跟李彦恢学javascript 电子书和课堂笔记1-15章.rar

    这本书深入浅出地介绍了JavaScript的基础知识,帮助读者掌握这门强大的脚本语言。JavaScript是一种广泛应用于Web开发的编程语言,它在网页交互、动态效果以及前后端数据交换等方面发挥着重要作用。 本书涵盖了1-15...

    圣思源的jquery学习笔记

    圣思源张龙老师的jQuery学习笔记,深入浅出地剖析了这个库的核心概念和实用技巧,对于想要深入理解jQuery或提升前端技能的开发者来说,无疑是一份宝贵的学习资源。 首先,jQuery的核心理念是"Write Less, Do More...

    林信良学习笔记之-AjaxGossip

    林信良的学习笔记《AjaxGossip》深入浅出地介绍了Ajax的核心概念和技术细节,对于初学者来说是一份非常实用的教程。 **Ajax基础** 1. **XMLHttpRequest对象**:Ajax的核心是XMLHttpRequest对象,它允许JavaScript...

    JSP学习笔记截屏1

    韩顺平老师是一位知名的Java和Web开发领域的讲师,他的课程通常深入浅出,易于理解,对于初学者尤其有帮助。 **JSP的基本结构**: JSP文件是一个包含HTML标记和JSP元素的文本文件。JSP元素主要有指令(Directives)...

    韩顺平html+css+javascript笔记完整版

    "韩顺平html+css+javascript笔记"是一套全面的前端学习资料,韩顺平是一位知名的编程教育专家,他的讲解通常深入浅出,适合初学者。笔记中可能涵盖了HTML的基本结构和语义化,CSS的选择器、布局和动画,以及...

    JavaScript忍者秘籍(第2版)笔记、习题与解析

    《JavaScript忍者秘籍(第2版)》是JavaScript编程领域的一本经典之作,它深入浅出地介绍了JavaScript的核心概念和技术。这本书不仅包含了基础语法,还涵盖了高级特性,旨在帮助读者成为JavaScript的高手,即“忍者...

    2010年北风网CJ讲师JavaScript_Ajax_jQuery视频教程下载地址

    本教程由北风网知名讲师CJ主讲,旨在深入浅出地讲解这三门技术,帮助学习者掌握现代Web开发的核心技能。 首先,JavaScript 是一种轻量级的解释型编程语言,主要用于客户端的网页开发。它赋予了网页动态性,允许...

    jQuery学习笔记

    在《锋利的jQuery》一书中,作者深入浅出地介绍了jQuery的核心概念和用法。 1. jQuery 对象与 DOM 对象 - DOM 对象是浏览器解析HTML文档后生成的一棵树状结构,代表了网页的结构。DOM对象可以是元素节点、文本节点...

    2023年韩顺平javascript课堂实录笔记千万别错过好东西.doc

    韩顺平老师的2023年JavaScript课堂实录笔记深入浅出地介绍了JS的核心概念和应用。 首先,JavaScript在网页中的应用非常广泛,包括地图搜索、网页游戏、用户输入验证(如邮箱、数字、身份证、IP地址等)、股市数据...

    韩顺平笔记.zip

    韩顺平老师是业界知名的IT教育专家,他的教程以其深入浅出的讲解方式深受广大程序员喜爱。这份笔记集合了他的教学经验,旨在帮助学习者更好地理解和掌握这些关键的技术。 1. **Java**: Java是一种广泛应用的面向...

    李炎恢js笔记

    这份笔记通过深入浅出的方式,系统地讲解了JavaScript从基础到高级的各个方面,无论你是初学者还是有经验的开发者,都能从中受益。通过阅读和实践,你将能够掌握JavaScript的核心技术和最佳实践,为在Web开发领域...

    2011韩顺平轻松搞定网页设计(html+css+js)之javascript现场授课笔记(完整版).doc

    JavaScript,简称为JS,是一种广泛应用于Web开发的轻量级脚本语言。...在网页设计中,JavaScript扮演着至关重要的角色,因为它允许开发者...韩顺平老师的课程提供了深入浅出的讲解,对于初学者来说是一份很好的学习资源。

    黑马程序员JAVA WEB全笔记pdf

    【Java Web 全面解析】 ...本笔记深入浅出地介绍了Java Web开发的核心技术,通过学习这些知识点,开发者可以构建功能丰富的动态网站,并为进一步学习Spring、Hibernate、MyBatis等高级框架打下坚实基础。

Global site tag (gtag.js) - Google Analytics