《JavaScript编程精粹》——对象篇

来源:互联网 发布:人工智能上市公司排名 编辑:程序博客网 时间:2024/05/16 06:14

检索

  • 利用||填充对象的默认值
    • var status = res['status'] || 'unkown'
    • 如果res[‘status’]是undefined那么status的值就是’unkown’
  • 利用&&避免TypeError错误
    • 如果flight.equipment已经是undefiled
    • 我们想获取flight.equipment.model就会报TypeError错误
    • 利用flight.equipment && flight.equipment.model可以预防出现这种错误

原型

  • 当创建一个新对象时,可以选择某个对象作为它的原型
  • 每个对象都连接着一个原型对象,并且原型对象的属性会被连接其的对象继承
  • 简化创建对象时指定原型
var stooge = {    'first-name': 'Jerome',    'last-name': 'Howard'};if (typeof Object.beget !== 'function') {    Object.create = function (o) {        var F = function () {};        F.prototype = o;        return new F();    };}//another_stooge的原型是stoogevar another_stooge = Object.create(stooge);/*创建的对象为F {}    __proto__: //这是原型链        first-name: "Jerome"        last-name: "Howard"*/
  • 更新对象的属性时,不会更新已连接的原型,在检索时才会被用到
if (typeof Object.beget !== 'function') {    Object.create = function (o) {        var F = function () {};        F.prototype = o;        return new F();    };}var stooge = {    'first-name': 'Jerome',    'last-name': 'Howard'};//another_stooge的原型是stoogevar another_stooge = Object.create(stooge);//给another_stooge的原型stooge添加profession属性stooge.profession = 'actor';/*此时原型链属性为F {}    __proto__:         first-name: "Jerome"        last-name: "Howard"        profession: "actor"*/console.log(another_stooge.profession === 'actor') //结果是true//我们并没有给another_stooge添加profession属性//但结果是true//以此说明检索属性时,如果本对象没有,会从原型链中查找,即从__proto__中查找//新增属性another_stooge.profession = 'driver'console.log(stooge.profession) //结果是actorconsole.log(another_stooge.profession) //结果是driver//通过给another_stooge新增profession来说明//更新本对象的属性值,不会影响到原型中相同名字的属性值

反射

  • 利用typeof可以确定属性的类型,但是原型中的属性一样会被辨认出来,利用hasOwnProperty判断属性是否为对象本身的属性,可以避免typeof读取到原型的属性类型
//省略了 Object.createvar stooge = {    'first-name': 'Jerome',    'last-name': 'Howard'};//another_stooge的原型是stoogevar another_stooge = Object.create(stooge);//给another_stooge的原型stooge添加profession属性stooge.profession = 'actor';console.log(typeof another_stooge.profession) //此处值为string//但是another_stooge是没有profession的//可以这样写,确定是对象本身的属性后才去做类型判断if (another_stooge.hasOwnProperty('profession')) {    console.log(typeof another_stooge.profession)}

枚举

  • for in可以遍历一个对象中所有的属性名,包括函数和原型中的属性,可以进行过滤,另外for in是无序的,需要有序时不应使用for in
    • 过滤方法一hasOwnProperty排除原型中的属性
    • 过滤方法二typeof排除函数

减少全局变量的污染

  • 使用一个自定义标识的全局变量
var Vue = {};Vue.data = {    'first-name': 'Jerome',    'last-name': 'Howard'};Vue.flight = {    airline: 'dbdddurex'};//这种情况下Vue就是自己定义的“一个”全局变量//这一个全局变量里面有几个变量都没关系,不会污染其他全局变量