JS 对象基础

JS Object Basics

1. Object

1.1 属性和方法

In object, values are writted in name:value pairs (name and value separated by a colon). 键值对直接用逗号隔开。

如果value不是函数,则它就是这个对象的属性property;

如果value是函数,则它就是这个对象的方法method:

var calculator = {
  num: [1, 2],
  add: function () {
    return this.num[0] + this.num[1];
  }
};
calculator.add(); //3

访问函数的property和method:

calculator.num; //[1, 2]
calculator["num"]; //[1, 2]
calculator.num[0]; //1
calculator["num"][1]; //2
calculator.add(); //3 调用method记得加括号,否则只是返回函数定义

1.2 子命名空间(对象套对象)

var person = {
  name: {
    first: "Alex",
    last: "O'Connor"
  },
  age: 30
};
person.name.first; //"Alex"

访问子命名空间,就一直链式dot下去

1.3 更新和创建属性/方法

var calculator = {
  num: [1, 2],
  add: function () {
    return this.num[0] + this.num[1];
  }
};
calculator.num = [2, 3];
calculator.add(); //5
calculator.operator = "+"; //增加了一个属性operator,其值为"+"
console.log(calculator);

用dot的表达去访问属性的时候,dot后面的就是那个属性的具体名称;而如果你想新增一个属性,但是它是变量,那么用[]表示法:

//接上面的calculator
var a = ["multiply", "divide", "substract"];
var b = ["*", "/", "-"];
calculator[a[0]] = b[0]; //属性的名字是a[0]的值
console.log(calculator);
/*
{
  num: [1, 2],
  operator: "+",
  multiply: "*",
  add: function () {
    return this.num[0] + this.num[1];
  }
}
*/

2. this

2.1 当this是在对象的method(第一层)里面

关键字"this"指向了当前代码运行时的对象( 原文:the current object the code is being written inside ).

这里指的第一层表示这个method内部不再另外包一个内部函数,this只在method的最外层函数的时候,被该对象调用这个方法时,this指向该对象。

2.2 this在全局函数内部

但是,当this在一个函数内部的时候,指向的对象其实是根据情况而定的。

其实this指向的是调用这个函数的对象。当一个函数在全局时,调用它的是全局对象window,所以这时候this指向的就是window。

//全局下
var myObj = {
  num: [1, 2],
  substract: function () {
    return this.num[1] - this.num[0];
  }
};
var num = [3, 6];
function add() {
  return this.num[0] + this.num[1];
}
add(); //9 这里调用add函数的是全局对象window,所以这个下面的this.num指的是全局变量num,而不是myObj的num
myObj.substract(); //1 这里调用substract的是myObj,所以this指向substract
var sub = myObj.substract;
sub(); //3 即使sub等于了myObj的方法定义,但是sub已经是函数了,调用这个函数的对象是全局对象window。

在strict模式下让函数的this指向undefined,因此,在strict模式下,你会得到一个错误:

"use strict";
var num = [3, 6];
function add() {
  return this.num[0] + this.num[1];
}
add(); //报错

2.3 method里面又包了函数

var myObj = {
  num: [1, 2],
  substract: function () {
    function substractFromTen() {
      return 10 - this.num[0] - this.num[1];
    }
    return substractFromTen();
  }
};
myObj.substract(); //报错,因为this在内部函数里,这时候this又指向了window

用that在第一层的时候捕获this,内层函数用that,就可以保证that指向的是对象

var myObj = {
  num: [1, 2],
  substract: function () {
    var that = this;
    function substractFromTen() {
      return 10 - that.num[0] - that.num[1];
    }
    return substractFromTen();
  }
};
myObj.substract(); //7

当然用apply,call也可以改变this的指向。

3. apply(), call(), bind()

var num = [3, 6];
function add() {
  return this.num[0] + this.num[1];
}
var myObj = {
  num: [2, 4]
}
add.apply(myObj, []);//6 将add函数里的this替换为myObj,则this实际上指向了myObj, []是像add函数传的参数, 空数组表示不传参
add.call(myObj); //6

call()和apply()的效果相同,fn.call(obj)fn.apply(obj)都是将fn中的this替换(指向)obj,并且马上执行fn。它们两个的区别在于传参(传给前面fn的参数)的形式:

var num = 9;
function fn(num1, num2) {
    console.log(num1 + num2);
    console.log(this.num);
}
var obj = {
  num: 5
};
fn.call(obj , 100 , 200);//300 5 call参数一个个传
fn.apply(obj , [100, 200]); //300 5 apply参数放在数组里传
var temp = fn.bind(obj, 50, 60); //不执行,所以无输出
temp(); // 110 5
fn.bind(obj, 10, 20);
fn(); //NaN 9 并不会显示你bind之后的值,不改变原来的fn

bind()与call()的区别在于,同样改变this指向,但是不会马上执行。上述例子中注意,一定要把bind过后的函数给一个temp的变量,然后调用temp().

用apply(), call()可以调用函数。

Math.max.apply(null, [2, 4 ,3]); //4 本来函数Math.max是要一个个数字作为参数的,需要找一个数组里最大值的时候只要用apply把这个数组当做参数传给max就好,null在非严格模式下绑定window

4. JSON

JSON 是用于将结构化数据表示为JavaScript对象的标准格式,通常用于在网站上表示和传输数据(例如从服务器向客户端发送一些数据,因此可以将其显示在网页上)。

JSON可以作为一个对象或者字符串存在,前者用于解读 JSON 中的数据,后者用于通过网络传输 JSON 数据。

  • JSON 是一种纯数据格式,它只包含属性,没有方法。

4.1 JSON Syntax

JSON来源于JavaScript,所以其书写拥有JS书写的规范:

  • Data is in name/value pairs 这里的name必须是string,用双引号;value必须是number, string, JSON object, array, boolean, null其中的一种,不能是undefined, date, function
  • Data is separated by commas
  • Curly braces hold objects
  • Square brackets hold arrays
{
  "name": "John",
    "age": 30,
  "employees": [ "John", "Anna", "Peter" ],
  "sale": true,
  "middlename": null
}

4.2 JSON.stringify()

JSON.stringify(),接收一个对象作为参数,返回的是对应的JSON字符串。

4.3 JSON.parse()

JSON.parse(),接收JSON对象字符串作为参数,返回JavaScript对象。

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

推荐阅读更多精彩内容