JavaScript的对象是一种无序的集合数据类型,它由若干键值对组成。
 
对象是一个包含相关数据和方法的集合,下面就是一个简单的对象
1 2 3 4 5 6 7 8 9 10 11 12 var  person = {  name  : ['Bob' , 'Smith' ],    age  : 32 ,   gender  : 'male' ,   interests  : ['music' , 'skiing' ],   bio  : function ( )  {     alert(this .name[0 ] + ' '  + this .name[1 ] + ' is '  + this .age + ' years old. He likes '  + this .interests[0 ] + ' and '  + this .interests[1 ] + '.' );   },   greeting : function ( )  {     alert('Hi! I\'m '  + this .name[0 ] + '.' );   } }; 
 
对象与值之间使用:隔开,对象里的string、number、array也叫对象的属性(property),对象里的函数也叫对象的方法(method),上面整个对象被称为对象的字面量(literal)
访问 点表示法 使用.来访问对象里的属性方法
1 2 person.name; person.age; 
 
对象也可以作为值
1 2 3 4 5 6 name: { 	first :'Bob' , 	last :'Smith'  } person.name.first; 
 
括号表示法 1 2 person['age' ]; person['name' ]; 
 
与数组有点类似,不同的是:对象是字符串到值的映射,数组是数字到值的映射
设置值 通过访问的形式修改
 
也可以新增一个属性或者函数
1 2 3 4 person.other = 'other' ; person.fun = function ( ) {     alert('hello world' ); } 
 
括号表示法的优点就是可以动态的设置成员名字
1 2 3 var  dataName = 'height' ;var  dataValue = '1.60cm' ;person[dataName] = dataValue; 
 
构造函数与对象 JS不像java那样可以使用class来声明类,而是使用了构造函数 的特殊函数来定义
1 2 3 4 5 6 7 8 9 10 11 12 13 function  createNewPerson (name )  {  var  obj = {};   obj.name = name;   obj.greeting = function  ( )  {     alert('Hi! I\'m '  + this .name + '.' );   }   return  obj; } var  salva = createNewPerson('salva' );salva.name; salva.greeting(); 
 
但这样定义有点不方便,因为创建一个空对象还要返回它,以下是一个便捷方法
1 2 3 4 5 6 7 8 9 10 function  Person (name )  {  this .name = name;   this .greeting = function ( )  {     alert('Hi! I\'m '  + this .name + '.' );   }; } var  person1 = new  Person('Bob' );var  person2 = new  Person('Sarah' );
 
注意:引用使用new才是才代表使用构造函数,里面的this才会绑定当前对象,为此构造函数名规定大写
 
封装new 使用createPerson将new封装起来
1 2 3 4 5 6 7 8 9 10 11 12 13 14 function  Person (props )  {  this .name = props.name || '无名氏' ;   this .age = props.age || 0 ; } Person.prototype.greeting = function ( )  {     alert('Hi! I\'m '  + this .name + '.' );   }; function  createPerson (props ) {	return  Person(props || {}) } let  p1 = createPerson({    name : 'muyang'  }); 
 
优点
创建对象的其他方式 Object() 1 2 3 4 5 6 7 8 var  person1 = new  Object ();var  person1 = new  Object ({  name  : 'Chris' ,   age  : 38 ,   greeting  : function ( )  {     alert('Hi! I\'m '  + this .name + '.' );   } }); 
 
create() 这个方法可以根据现有对象创建新的对象
1 var  person2 = Object .create(person1);
 
方法 对象里的函数叫方法,如
1 2 3 4 5 6 7 8 var  xiaoming = {    name : '小明' ,     birth : 1990 ,     age : function  ( )  {         var  y = new  Date ().getFullYear();         return  y - this .birth;     } }; 
 
viewthis 
是一个变量,代表当前对象
 
需要注意的是this在哪定义,调用形式是什么,如果使用xiaoming.age()调用的话this就代表xiaoming;如果函数在外面,如
1 2 3 4 5 6 7 8 9 function  getAge  ( )  {    var  y = new  Date ().getFullYear();     return  y - this .birth; } var  xiaoming = {    name : '小明' ,     birth : 1990 ,     age : getAge }; 
 
此时如果使用getAge()调用则会代表全局对象,会返回NaN,而且必须采用xiaoming.age()这个形式调用,就算赋值给变量也不行
 
如果是在对象方法内定义函数,里面的this也会变回全局对象
 
 
1 2 3 4 5 6 7 8 9 10 11 var  xiaoming = {    name : '小明' ,     birth : 1990 ,     age : function  ( )  {         function  getAgeFromBirth ( )  {             var  y = new  Date ().getFullYear();             return  y - this .birth;         }         return  getAgeFromBirth();     } }; 
 
    此时使用xiaoming.age()也会返回NaN,解决方法就是将this变量存起来传递,或者使用apply()
1 2 3 4 5 6 7 8 9 10 11 12 var  xiaoming = {    name : '小明' ,     birth : 1990 ,     age : function  ( )  {     	var  that = this ;         function  getAgeFromBirth ( )  {             var  y = new  Date ().getFullYear();             return  y - that.birth;         }         return  getAgeFromBirth();     } }; 
 
控制this指向,函数内有一个apply()方法,第一个参数就是this指向的对象,第二个参数是数组,里面对应函数的参数
1 2 3 4 5 6 7 8 9 10 11 12 13 function  getAge ( )  {    var  y = new  Date ().getFullYear();     return  y - this .birth; } var  xiaoming = {    name : '小明' ,     birth : 1990 ,     age : getAge }; xiaoming.age();  getAge.apply(xiaoming, []);  
 
装饰器 在不改变原有结构给函数添加新功能,下面给出一个示例
假如我想给console.log()添加功能:打印当前时间+内容,我可以这样做
1 2 3 4 5 6 oldConsoleLog  = console .log; console .log = function  (arg ) {    let  date = new  Date ();     return  oldConsoleLog(date+'\n' +arg); } 
 
标准对象 经常会使用这些对象,如Date等等
Date 表示日期和时间
先来看看对象本身
1 2 3 4 5 6 Date ()    UTC : function  UTC ( )     length : 7     name : "Date "     now : function  now ( )     parse : function  parse ( ) 
 
UTC:接收时间参数,返回1970年1月1日UTC 00:00:00(UNIX时间纪元)以来的毫秒数 
now:返回当前时间从时间纪元以来的毫秒数 
parse:可以接收字符串的时间,ISO 8601 格式 
 
有了一点原型知识,再看一下他的prototype
Date.prototype >folded 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 prototype: {…}     constructor : function  Date ( )     getDate : function  getDate ( )     getDay : function  getDay ( )     getFullYear : function  getFullYear ( )     getHours : function  getHours ( )     getMilliseconds : function  getMilliseconds ( )     getMinutes : function  getMinutes ( )     getMonth : function  getMonth ( )     getSeconds : function  getSeconds ( )     getTime : function  getTime ( )     getTimezoneOffset : function  getTimezoneOffset ( )     getUTCDate : function  getUTCDate ( )     getUTCDay : function  getUTCDay ( )     getUTCFullYear : function  getUTCFullYear ( )     getUTCHours : function  getUTCHours ( )     getUTCMilliseconds : function  getUTCMilliseconds ( )     getUTCMinutes : function  getUTCMinutes ( )     getUTCMonth : function  getUTCMonth ( )     getUTCSeconds : function  getUTCSeconds ( )     getYear : function  getYear ( )     setDate : function  setDate ( )     setFullYear : ƒ setFullYear ( )     setHours : ƒ setHours ( )     setMilliseconds : ƒ setMilliseconds ( )     setMinutes : ƒ setMinutes ( )     setMonth : ƒ setMonth ( )     setSeconds : ƒ setSeconds ( )     setTime : ƒ setTime ( )     setUTCDate : ƒ setUTCDate ( )     setUTCFullYear : ƒ setUTCFullYear ( )     setUTCHours : ƒ setUTCHours ( )     setUTCMilliseconds : ƒ setUTCMilliseconds ( )     setUTCMinutes : ƒ setUTCMinutes ( )     setUTCMonth : ƒ setUTCMonth ( )     setUTCSeconds : ƒ setUTCSeconds ( )     setYear : ƒ setYear ( )     toDateString : ƒ toDateString ( )     toGMTString : ƒ toUTCString ( )     toISOString : ƒ toISOString ( )     toJSON : ƒ toJSON ( )     toLocaleDateString : ƒ toLocaleDateString ( )     toLocaleString : ƒ toLocaleString ( )     toLocaleTimeString : ƒ toLocaleTimeString ( )     toString : ƒ toString ( )     toTimeString : ƒ toTimeString ( )     toUTCString : ƒ toUTCString ( )     valueOf : ƒ valueOf ( )     Symbol (Symbol .toPrimitive ): ƒ [Symbol .toPrimitive ]( )     __proto__ : Object  
 
使用Date实例化的对象可以有这些方法,太多了我就介绍几个常用的,只需要注意月份从0开始就行了
1 2 3 4 5 6 7 8 9 10 11 var  now = new  Date ();now;  now.getFullYear();  now.getMonth();  now.getDate();  now.getDay();  now.getHours();  now.getMinutes();  now.getSeconds();  now.getMilliseconds();  now.getTime();  
 
Date()可以接受毫秒数和时间参数,都可以以本地时间格式显示出来
 
Math Math >folded 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 Math     E : 2.718281828459045      LN10 : 2.302585092994046      LN2 : 0.6931471805599453      LOG10E : 0.4342944819032518      LOG2E : 1.4426950408889634      PI : 3.141592653589793      SQRT1_2 : 0.7071067811865476      SQRT2 : 1.4142135623730951      abs : function  abs ( )     acos : function  acos ( )     acosh : function  acosh ( )     asin : function  asin ( )     asinh : function  asinh ( )     atan : function  atan ( )     atan2 : function  atan2 ( )     atanh : function  atanh ( )     cbrt : function  cbrt ( )     ceil : function  ceil ( )     clz32 : function  clz32 ( )     cos : function  cos ( )     cosh : function  cosh ( )     exp : function  exp ( )     expm1 : function  expm1 ( )     floor : function  floor ( )     fround : function  fround ( )     hypot : function  hypot ( )     imul : function  imul ( )     log : function  log ( )     log10 : function  log10 ( )     log1p : function  log1p ( )     log2 : function  log2 ( )     max : function  max ( )     min : function  min ( )     pow : function  pow ( )     random : function  random ( )     round : function  round ( )     sign : function  sign ( )     sin : function  sin ( )     sinh : function  sinh ( )     sqrt : function  sqrt ( )     tan : function  tan ( )     tanh : function  tanh ( )     trunc : function  trunc ( )     Symbol (Symbol .toStringTag ): "Math " 
 
Math完全就是一个工具类,没有prototype,比较常用的就是random(),数学不好,就不过多解释了