JS-对象,包装类--渡一教育(视频笔记)

对象

对象属于一种复合的数据类型,在对象中可以保存多个不同数据类型的属性
1、用已学知识点,描述一下你心目中的对象

var mrDeng = {
    name : "MrDeng",
    age : 40,
    sex : "male",
    health : 100,
    smoke : function () {
        console.log('I am smoking! cool!!!');
        this.health --;
    }
    drink : function () {
         console.log('I am drink');
         this.health ++;
    }
}

2、属性的增:对象.属性名 = 属性值
对象[“属性名”] = 属性值
使用[ ]这种形式去操作属性,更加的灵活,在[ ]中可以直接传递一个变量,这样变量值是多少就会读取那个属性

obj["123"] = 789;
obj["nihao"] = "nihao";
var n = "123";
console.log(obj[n]);//789
因为 n 的值为"123",而 obj 对象"123"的属性值为789
JS中的属性值可以是任意的数据类型,甚至它也可以是一个对象

属性的删:delete 对象.属性

属性的改:对象.属性 = 新的属性值

属性的查:对象.属性
(如果读取对象中没有的属性,不会报错而是返回undefined)

in运算符:检查一个对象是否含有指定的属性,有则返回true,没有则返回false
语法:“属性名” in 对象
console.log(“test” in obj); //false

对象的分类

  1. 内建对象:在ES标准中定义的对象,在任何的ES的实现中都可以使用
    比如:Math;String;Number;Boolean;Function;Object…
  2. 宿主对象:在js的运行环境提供的对象,目前来讲主要指由浏览器提供的对象
    比如:BOM;DOM
  3. 自定义对象:由开发人员自己创建的对象

对象的创建方法

  1. 字面量
    var 对象 = {属性名 : 属性值, 属性名 : 属性值…}
    名与值之间使用:连接,多个名值对之间使用逗号隔开。如果一个属性之后没有其他的属性了,就不要写逗号

  2. 构造函数
    系统自带:new Object(); Array(); Number();Boolean(); String(); Date();
        var 对象 = new Object();//再在后面添加属性
    new 开辟新的堆内存空间,存储对象的内容,若是没有new,则没有内存空间,对象也就无法实例化
    若是我们只有"new 类名称();"这部分的话,那就是只是在堆中开辟了一个空间来保存对象信息,没有栈去指向它。也就是这个空间是没有名字的。
    所以,没有栈指向的对象就叫做匿名对象。
    自定义:function Person() {}

function Car(color){//为与普通函数区分开,构造函数人为的遵循大驼峰式命名规则,即所有单词首字母均大写
    this.name = 'BMW';
    this.color = color;
    this.height = '1400';
    this.long = '4900';
    this.weight = 1000;
    this.health = 100;
    this.run = function(){
        this.health --;
    }
}
var car = new Car('red');
var car1 = new Car('green');
car.run;
car.name = 'Maserati';
//{name:Maserati; color:red; height:1400; long:4900; weight:1000; health:99}
car1.name = 'Merz';
//{name:Merz; color:green; height:1400; long:4900; weight:1000; health:100}
  1. Object.create (原型) 方法

构造函数内部原理

  1. 在函数体最前面隐式的加上 var this = {};

  2. 执行 this.xxx = xxx;

  3. 隐式的返回this

function Person(name, height){
    //var this = {};
    this.name = name;
    this.height = height;
    this.say = function(){
        console.log(this.say);
    }
    //return this;
}
console.log(new Person('xiaowang', 180).name);//匿名对象

若显示的返回return {};则在控制台输出为Object {}
若显示的返回return 123;原始值,则不影响控制台输出Person {name: “xiaowang”, height: 180},因为使用 new 的话,必须返回对象值(数组,函数),若返回的是原始值,系统会自动忽略,强制返回对象

包装类

new String();
new Boolean();
new Number();

只有对象有属性,原始值没有属性
undefined 和 null 不可以设置属性

var num = 4;//原始值数字4,没有属性、方法
num.len = 3;//
//隐式new Number(4).len = 3;       然后delete隐式创建的
console.log(num.len);//访问时再次隐式new Number(4).len;和上面的不是同一个new Number(4);
//返回undefined

-----------------分隔线-------------------

var num = new Number(123);//对象123,可以添加属性、方法,可以参与运算,运算后变为数字
//控制台执行num * 2  结果返回原始值数字246

-----------------分隔线-------------------

var str = "abcd";//原始值,没有属性、方法
//控制台可以调用执行str.length,是因为经历包装类的过程
str.abc = 'a';//保存刷新并不报错,但在控制台执行str.abc时输出undefined


-----------------分隔线-------------------

var str = new String('abcd');//对象
str.a = 'bcd';//控制台中访问str的a属性,为字符串bcd
str.sayValue = function (){return this.a;}//控制台执行str.sayValue(),输出字符串bcd

-----------------分隔线-------------------

var bol = new Boolean('true');//控制台访问bol,输出Boolean{[[PrimitiveValue]]: true}

在原始值调用属性的时候(无论是赋值或查找),原始值自己不能有属性,原始值会隐式的发生一个过程(new Number(4).len = 3;)来弥补你操作的不足,这步完成后它会销毁(delete)这个隐式过程

例题:
var str = 'abcd';
str.length = 2;
//隐式new String('abcd').length = 2;   delete
console.log(str);//输出结果abcd
console.log(str。length);//输出结果为4
//隐式new String('abcd').length;  对象
//.length是系统自带的属性,对象字符串本就有这个属性,代表字符串的长度
//new Number()没有length属性

 
作业:

1var str = "abc";
   str += 1;
   var test = typeof(str);//test=="string"
   if(test.length == 6){
       test.sign = "typeof的返回结果可能为String"//test是原始值,没有属性,赋属性值没用,
       //new String(test).sign = 'XXX';
   }
   //new String(test).sign
   console.log(test.sign);//输出undefined

2、下面这段js代码执行完毕后x,y,z的值分别是多少? //1 4 4
   var x = 1, y = z = 0;
   function add(n){
       return n = n + 1;
   }//预编译后被覆盖
   y = add(x);//4
   function add(n){
       return n = n + 3;
   }
   z = add(x);//4

3、下面代码中console.log的结果是[1,2,3,4,5]的选项是:  ACD
   A.function foo(x){
        console.log(arguments);
        return x;
     }
     foo(1,2,3,4,5);
     
   B.function foo(x){
        console.log(arguments);
        return x;
     }(1,2,3,4,5)//不执行不报错,系统会将(1,2,3,4,5)当成另外一部分
   
   C.(function foo(x){
        console.log(arguments);
        return x;
     })(1,2,3,4,5)
     
   D.function foo(){bar.apply(null,arguments)}
     function bar(x){console.log(arguments)}
     foo(1,2,3,4,5)
2、分析下面的JavaScript代码段
   function employee(name,code){
       this.name = "wangli";
       this.code = "A001";
   }
   var newemp = new employee("zhangming",'A002');
   document.write("雇员姓名:"+ newemp.name+"<br>");
   document.write("雇员代号:"+ newemp.code+"<br>");
   输出结果是( A ).(单选)
   A.雇员姓名:wangli  雇员代号:A001
   B.雇员姓名:zhangming  雇员代号:A002
   C.雇员姓名:null  雇员代号:null
   D.代码有错误,无输出结果

5function Person(name, age, sex){
       var a = 0;
       this.name = name;
       this.age = age;
       this.sex = sex;
       function sss(){
           a ++;
           document.write(a);
       }
       this.say = sss;
   }
   var oPerson = new Person();
   oPerson.say();//1
   oPerson.say();//2
   var oPerson1 = new Person();
   oPerson1.say();//1
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值