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

检索

  • 利用||填充对象的默认值
    • 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的原型是stooge
var 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的原型是stooge
var 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) //结果是actor
console.log(another_stooge.profession) //结果是driver
//通过给another_stooge新增profession来说明
//更新本对象的属性值,不会影响到原型中相同名字的属性值

反射

  • 利用typeof可以确定属性的类型,但是原型中的属性一样会被辨认出来,利用hasOwnProperty判断属性是否为对象本身的属性,可以避免typeof读取到原型的属性类型
//省略了 Object.create

var stooge = {
    'first-name': 'Jerome',
    'last-name': 'Howard'
};

//another_stooge的原型是stooge
var 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就是自己定义的“一个”全局变量
//这一个全局变量里面有几个变量都没关系,不会污染其他全局变量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值