JavaScript原型和闭包之---为对象添加属性和方法以及in 、delete关键字(一)

对象的动态特性是指:在对象创建出来之后,为对象添加新的属性或者方法。

给对象添加属性和方法有两种:

  1. 点语法
  2. []

使用点语法给对象添加属性和方法

      var obj = {
          name: "kong",
          age:23
      }

   // 使用点语法 :  给obj对象添加属性和方法
      obj.hobby = "runing";
      obj.eat = function(){
        console.log("开开心心的大吃!")
      }
      console.log(obj);

      obj.eat();

这里写图片描述
如果给代码做些变化呢

 obj.name = "diligentkong";
 console.log(obj.name);  //输出 diligentkong

**使用点语法进行赋值的时候,如果对象存在该属性,是修改操作;
如果对象不存在该属性,是给该对象新增属性并且赋值**

使用中括号[]的方法

对象名[属性名] 注意:这里的属性名是字符串
通过对象名[属性名]的方式可以做到:
1.获取对象的属性值
2.修改对象的属性值
3.为对象新增属性并赋值
看例子
获取对象的属性:这是获取obj的name属性

console.log(obj["name"]); //diligentkong

修改对象的属性值,将obj对象的name属性的值修改为kongkong

obj["name"] = "kongkong";
      console.log(obj["name"]); //kongkong
     // 为对象新增属性并赋值
      obj["sing"] = {
        singer : "张信哲"
      };

      console.log(obj["sing"]);

 obj["drink"]=function(){
        console.log("我喜欢和白开水");
      }
      obj[drink](); //我喜欢和白开水

这里要说一下in关键字

in关键字的用法

1.在for..in 循环中遍历对象的键
2.判断属性是否存在对象中 语法: 属性名 in 对象

举例:
for...in

  var obj = {
        name:'kong',
        age:23
       }
       for (var k in obj) {
        console.log(k);//输出 name  age
        console.log(typeof k);  //输出 string  string
       }

通过以上可以发现 对象的键为string字符串类型
也就是说 使用in关键字的时候,属性名称为字符串类型,需要用引号引起来
举例:

 var paraName = "name";
 var isExsit = paraName in obj;
 console.log(isExsit); // true
简单写成:
console.log("hobby" in obj);

在混入式继承关系上,如果要把一个对象的属性和方法 拿过来用到另一个独享上,要使用[]的方式获取属性、添加属性。若是使用点语法,那么会把k当做变量,而不是对象的键。看例子
//当前没有的属性和方法,别人有,拿过来用 ,就是继承(继承后续会解释的)

 var o = {

        }
 var obj = {
      name :"diligentkong",
      age : 18,
      sayHello :function () {
          console.log("Hello world");
      }
  }

        //混入式继承
        for(var k  in obj){
        // 一定要使用[]的方式,否则会把k当做属性
            o[k] = obj[k];
        }

        console.log(o);

in 关联数组

var arr=[2,4,6,8,10];
console.log(0 in arr); // 输出true

刚才提到 对象的键是字符串类型,为什么在关联数组的时候,打印输出的是true呢?
因为 in关键字操作数组的时候判断的是索引是否存在而不是值,当索引不是字符串的时候,会做一个隐式转换,将0 修改为”0”

console.log("0" in arr); // true
也就是console.log(0 in arr); <=>console.log("0" in arr); // true  隐式转换

如何判断数组中是否存在指定的值

  1. for循环 如果找到了就输出
  2. indexOf 返回值为指定的数对应的索引,如果没有找到 返回-1
console.log(arr.indexOf(9)); // -1

delete关键字

1.delete关键字可以用来删除对象的属性,还有未使用var声明的变量
2.delete关键字有返回值 用来表示删除属性是否成功
3.如果删除的是不存在的属性,返回值为true
4.如果删除的属性存在原型当中,那么返回值为true,但是并未删除
自己对号入座吧!

var obj = {
        name : "kong",
        age : 20
    }


    console.log(obj.name);
    var result = delete obj.name;
    console.log(obj.name, result);  // undefined true

    var num  = 10;
    num1 = 100;
    console.log(num1); //100

   result = delete num1;
    console.log(window.num1, result); // undefined true

    var num = 10;
    var result = delete  num;
    console.log(result);  //false


  var result=  delete obj.gender;
   console.log(result); //true

    console.log(obj.toString()); //[object Object]

    var result = delete obj.toString;
    console.log(result); //true
    console.log(obj.toString());//[object Object]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值