JavaScript语言精粹学习笔记之对象

JavaScript的简单类型包括
1.数字number
        JS不分整形和浮点型,都是number类型
        两个浮点数相加,精度不够
2.字符串 string
3. 布尔值 boolean
4. null
5. underlined
6.复杂对象、Function、Array

以上都是简单数据类型

其他都是对象Function Array

 研究一下 前五个都是疑似对象 因为他们拥有方法 但是他们是不可改变的?

简单数据类型,不是对象? 


数字、字符串、布尔值貌似对象,因为他们拥有方法,但他们是不可变的

 对象是可变的键控集合。

数组、函数、正则表达式都是对象,对象是属性的容器

尝试检索一个undefined的值会倒是typeerror异常,&&运算符来避免错误

 a.b&&a.b.c  //undefined

3.5 原型

当创建一个新对象时,可以选择某个对象为其原型,可以尝试给 Object 添加一个 create 方法,它可以创建一个使用原对象作为其原型的新对象。

  var box={
    check:'book',
    checkbox:{
      check:'pencil',
      price:'30元'
    },
    getPrice:function(){
      return '25元'
    }
  }
if(typeof Object.beget!=='function'){
  Object.create=function(o){
    var F=function(){};
    F.prototype=o;//使其原型改为传进来的对象
    return new F();
  }
}
var goodsInfo=Object.create(box)
console.log(goodsInfo.check)//'book'
console.log(goodsInfo.getPrice())//'25元'

3.6 反射

检查并确定对象具有的属性,只有进行检索并验证即可,通常使用typeof

typeof box.check; //"string"
typeof box.checkbox; //"object"
typeof box.getPrice; //"function"

但原型链中的任何属性还会产生同一个值constructor

typeof box.toString; //'function'
typeof box.constructor; //'function'

为了处理掉这些不需要的属性,可以换种方法来验证,比如利用hasOwnProperty

box.hasOwnProperty("check"); //true
box.hasOwnProperty("getcheck"); //false

它用来检验是否是对象独有的属性,它将返回对应的布尔值,它不会检查原型链

3.7 枚举法

for in 语句用来遍历对象中的所有属性名。该枚举过程会列出所有的属性(包括函数和原型链中的属性 )

    var father = {
        fatherAttr: 1
    };

    // 以father为原型创建对象实例instance
    var instance = Object.create(father);

    instance.a = 1;
    instance.b = 1;
    instance.c = 1;

    for (var attr in instance) {
        console.log(attr, instance[attr]);
    }

    // a 1
    // b 1
    // c 1
    // fatherAttr 1

    // 获取instance实例的自有属性名
    console.log(Object.getOwnPropertyNames(instance));

    // ["a", "b", "c"]

同时一般利用 typeof 来排除不想要的函数                                             

var box = {
  check: "book",
  checkbox: {
    check: "pencil",
    price: "30元",
  },
  getPrice: function () {
    return "25元";
  },
};

for (name in box) {
  if (typeof box[name] !== "function") {
    console.log(name + ":" + box[name]);
    //check:book
    //checkbox:[object Object]
  }
}

属性名具有不确定性,因此要以特定的顺序出现,最好的方法是避免for in的使用,而是创造一个数字,包括正确的属性名。

var box = ["book", "pencil", "30元"];

for (let i = 0; i < box.length; i++) {
  console.log(box[i]);
}

for in不仅可以遍历对象,数组,还可以遍历字符串。

3.8 删除

delete 运算符可以用来删除某对象的属性,若此对象含有该属性,则移除(不会对原型链中的对象产生影响)

删除某对象的属性,可能会让它原型链中的此属性表现出来

若原型链 object 上有 a 属性,而对象 A 身上也有 a 属性,则 A 使用时以自身为准(这也是为什么,删除 A 身上的 a 属性时,A 身上的 object 的 a 属性生效的原因)

function Pro() {}
Pro.prototype = {
  constructor: Pro,
  name: "proto",
  sex: "boy",
  hobby: "coding",
};
var fakePro = new Pro();
fakePro.hobby = "钓鱼";
console.log(fakePro.hobby); //'钓鱼'
delete fakePro.hobby;
console.log(fakePro.hobby); //'coding'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值