JavaScript-对象,包装类

对象

在JavaScript中是没有类的概念的,只有对象。无论是字符串,数值,数组还是函数,其本质都是对象。

对象的创建方法:

1:var obj={}    plainObject    对象字面量/对象直接量

2:构造函数 

        1)系统自带的构造函数 Object( )

         2) 自定义的构造函数 


1对象字面量/对象直接量

通过一段代码来认识一下这个过程.

             var My = {
                 name: 'cyl',
                 age: 19,
                 sex: 'male',
                 food: function(myLike) {
                     console.log("I like eating "+myLike);
                 },
                 drink: function(myLike) {
                     console.log("I like drinking "+myLike);
                 }
             }

控制台运行如下:


ps:那个undefined表示的是函数返回值,因为没有,所以是undefined,

变量和方法用,号隔开

属性的增,删,改,查。

1:增加一个新的属性。


对象.新属性=(赋值)新的属性就添加了。

2:删除一个新的属性。这里需要借助一个操作符delete


delete 对象.属性就删除了,后面的true是delete的返回值

3:改变某一个属性的值


对象.属性=新的值

4:查找某一个属性的值


对象.属性就可以访问了,因为没有girlfriend这个属性就是undefined.


利用系统自带的构造函数 Object( )产生对象。

在一个构造函数面前加上运算符new就可以产生彼此相互独立的对象了

             var Person1=new Object();
             var Person2=new Object();

然后Person1和Person2就是俩个对象了,但是一开始里面是没有撒的,我们通过刚刚前面的四种操作来实现属性的增,删,改,查。


我们用new Object()产生的对象都是彼此互相独立的,它们互相不干扰。

var obj=new Object();和var obj={};  一样


自定义构成函数产生对象。

构造函数和函数结构上没有任何区别!我们只需要用操作符new来产生一个对象

function Obj (){

}
var my =new Obj() ;

由于构造函数和函数没有任何区别,所以构造函数的命名需要满足“大驼峰式命名规则”(人为规定的)即但凡是是单词首字母就大写。

大驼峰式命名规则:TheFirstName

小驼峰式命名规则:theFirstName

             function Obj(){
                 this.name='cyl';
                 this.age=19;
                 this.sex='male';
                 this.food=function(myLike) {
                     console.log("I like eating "+myLike);
                 }
             }
             var my=new Obj();

每用一次new Obj()就会产生一个互相不干扰的对象。

obj()里面也可以传参数进出,用于赋值属性。

function Obj ( name , age , sex ){
this . name = name ;
this . age = age ;
this . sex = sex ;
this . food = function ( myLike ) {
console . log( " I like eating " + myLike) ;
}
}
var my =new Obj( ' cyl ' , 19 , ' male ') ;

同样可以用上面的四种操作符对对象进行操作。

为啥要加this然后就可以成为构造函数,产生对象了。

构造函数的内部原理。

1:在函数体前面隐式加上this{}

2:执行this.xxx=yyy;//往this{}里面加东西

3:返回this

当一个函数的前面写上new的时候就会发生上面的三步操作了

             function Obj(name,age,sex){
                 /*this{
                       this.name=name;
                       this.age=age;
                       this.sex=sex;
                       this.food=function(myLike) {
                       console.log("I like eating "+myLike);
                    }
                 }
                 */
                 this.name=name;
                 this.age=age;
                 this.sex=sex;
                 this.food=function(myLike) {
                     console.log("I like eating "+myLike);
                 }
                 //return this;
             }

现在应该明白为什么new 函数()就会产生对象了。

ps:函数前面一定有new,不然就普通函数


模拟构造函数

看如下代码:

            function Obj(name,age,sex){
              var that={};
                that.name=name;
                that.age=age;
                that.sex=sex;
                that.food=function(myLike) {
                     console.log("I like eating "+myLike);
                }
              
            return that;
             }
             var my=Obj('cyl',19,'male');
我们看到obj()前面没有new ,但是依然可以,因为我们函数里面已经实现了new的三步了。


但是这种方法基本不用。


破坏new隐式的三步

看如下代码:

              function Obj(name,age,sex){
                 this.name=name;
                 this.age=age;
                 this.sex=sex;
                 this.food=function(myLike) {
                     console.log("I like eating "+myLike);
                 }
                 return {};//*****
             }
             var my=new Obj('cyl',19,'male');

不调用return this;那么会发生什么了。


没错它是空的了!!!(很明显会调用return {};自己都写了就不会隐式调用return this;)

一个小知识点:

              function Obj(name,age,sex){
                 this.name=name;
                 this.age=age;
                 this.sex=sex;
                 this.food=function(myLike) {
                     console.log("I like eating "+myLike);
                 }
                 return 123;
             }
             var my=new Obj('cyl',19,'male');

将return {};改为return 123;结果是什么?


计算机有一个规定,既然你使用了new操作符,那么你就必须返回对象,{}是一个空对象,对于像123(原始值),null,undefined...等这样的原始值是直接忽略的。


包装类

在JavaScript中只有对象才有属性和方法,原始值是没有的。

像对象自己,function,数组..都是对象。123(原始值),null,undefined..是原始值。

看如下代码:

            var num=123;
            var Num=new Number(123);

Number()是系统的构造函数,然后使得Num变成对象了


然后Num满足上面对象的操作了。


注意,如果对象进行+-*/等运算这样的操作的时候,就会变成原始值


字符串啊,boolean啊,什么的同理。


下面我们看一段代码,

           var str="123";
           str.abc='456';

什么咯?不是原始值没有属性方法的吗?

然而没有出错。但是


并没成功!

在JavaScript中只有对象才有属性和方法,原始值是没有的!!!

那么为什么没有出错了!

计算机很聪明,知道str是原始值没有属性方法,但是又不想报错,它做了一个隐式操作:

str.abc='456' 计算机把它变成 new String(str).abc='456';

那为什么访问不到了,因为原始值没有属性这个是肯定不能打破的,然后计算机马上就把它delete了,

访问时又变成了new String(str).abc,这个是一个新对象,刚刚那个已经被delete了,这个是新的,然而没有赋值,所以undefined。

这个操作就是包装类

此时应该可以理解字符串(原始值)为什么会有length属性了,那是因为转化为String对象了,length属性String是本来有的,系统带的。会有错觉以为字符串有length属性,这是不可能的。

ps:


null和undefined是绝不能有属性方法的,直接报错!






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值