JS学习3

前言:(1)变量及其值保存在栈内存中,变量独立存在,修改一个,另外一个不会进行改变。
(2)对象保存在堆内存之中,obj变量保存的是地址,指向堆内存,所以修改一个另外一个也会改变。
(3)let obj1=new Obiject();
let obj2=new Obiject();
哪怕其中包含的值一样,但是new就已经创建了新的空间,所以
obj1==obj2 返回的是false
(4)对象的分类:在这里插入图片描述
(5)立即调用函数
没有函数名,直接调用
(function(){alter(‘is’);})()
也就是fun外部加一个括号,其后再加一个括号,里面函数如果设置有参数,传参及时最后括号内加入参数

1.引用
当一个对象变量被拷贝 —— 引用则被拷贝,而该对象并没有被复制
引用之后,两者指向同一地方,任意一个做出相关的数据修改,另外一个数据也修改

   <script>
        //let fruit=prompt('whhile fruit you want');
        let user={
            '+2':'二傻',
            '+3':'三傻',
            '+1':'大傻',
        }
        let user2=user;
        user2['+2']='三傻';
        //此时输出为三傻,也就意味着引用之后,两者指向同一位置
        alert(user['+2']);
   </script>

(1)对于对象来说,普通相等 == 和严格相等 === 是两个作用结果完全一样的运算符。
仅当两个对象为同一对象时,两者才相等。
上案例alter(user==user2);输出为true

2.要实现上述效果有如下方法:
(1)

   <script>
        //let fruit=prompt('whhile fruit you want');
        let user={
             name:'jim',
             age:18,
        };
        let user2={};

        for(let key in user)
        {
             user2[key]=user[key];
        }
        alert(user2.name);//jim
        user2.name='pete';
        alert(user2.name);//pete
        alert(user.name);//jim
   </script>

(2)
Object.assign(dest, [src1, src2, src3…])
dest:拷贝其余对象到自己内部的对象
srcn:其后的全是要被拷贝进去的对象

   <script>
        //let fruit=prompt('whhile fruit you want');
        let user={
             name:'jim',
        };

        let user2={age:18,};
        Object.assign(user,user2);
        alert(user.age);//能够成功显示18
   </script>

进行简单的全体拷贝,简便上述for…in方法

  <script>
        //let fruit=prompt('whhile fruit you want');
        let user={
             name:'jim',
             age:18,
        };
        //尤为重要
        let user2=Object.assign({},user);
        alert(user2.name);
   </script>

3.对象之中的函数

   <script>
        //let fruit=prompt('whhile fruit you want');
        let user={
             sayhi(){
                  alert('hello');
             }
        }

        user.sayhi();
   </script>

还有:

   <script>
        //let fruit=prompt('whhile fruit you want');
        let user={
        };

        function sayhi(){
             alert('hello');
        }
        //注意sayhi后面没有括号
        user.sayhi=sayhi;
       user.sayhi();
        //注意,第一行sayhi没有括号。后一个有括号

   </script>

4.this
在 JavaScript 中,this 关键字与其他大多数编程语言中的不同。JavaScript 中的 this 可以用于任何函数。

<script>
        //let fruit=prompt('whhile fruit you want');
        let user={
             name:'jhon',
             sayhi(){
                  //此处可以使用user.name但是会出现一些毛病,推荐使用this
                  alert(this.name)
             }
        }

        user.sayhi();
   </script>

this运用:

   <script>
        let user={name:'sun',};
        let user2={name:'pete',};

        function sayName()
        {
             alert(this.name);
        }

        user.f=sayName;
        user2.f=sayName;

        user.f();
        user2.f();

   </script>

五:重用对象的创建(new)
构造函数要求如下:
(1)他们的命名以大写字母开头
(2)他们只能由’new’操作符来执行
即:任何函数都可以通过 new 来运行,它会执行上面的算法。“首字母大写”是一个共同的约定,以明确表示一个函数将被使用 new 来运行。

   <script>
        //注意首字母大写
        function User(name){
             this.name=name;
             this.isAdmin=false;
             //其中也可以设定函数方法
             //但是出现问题,此处没有一个新对象的创建,就需要创建一个函数。
             //可以采取全局函数的做法如下
             //代码改为:this.sayName=fun;
             this.sayName=function()
             {
             alter(this.name);
             }
        }
        function fun()
        {
              alter(this.name);
        }


        let user=new User('jack');
        alert(user.name);

   </script>

注意:上述代码之中的备注,提示了采用全局函数的方法来减少每次对象创建之中的函数创建,但是全局函数往往很容易造成问题,别人进行相同定义的全局函数,就会进行覆盖,则上述则需要有一个原型对象
六:原型对象:
我们创建的每一个函数,解析器都会向函数之中添加一个属性prototype,这个属性对应着一个对象,这个对象就是我们所谓的原型对象。
在构造函数内,运用:
let mc=new Myclass()//Myclass为构造函数
调用其中的原型对象为:mc.proto

在这里插入图片描述
在这里插入图片描述

   <script>
        
        function User(name,age){
             this.name=name;
             this.age=age;
        }

        User.prototype.sayName=function()
        {
             alert(this.name);
        }

     let user=new User('jhon',18);
     let user2=new User('pete',19);
     user.sayName();
     user2.sayName();

   </script>

注意:如果检查对象之中是否还有某个属性用in,但是在原始模型之中的属性用In检查则是true,但是如果要检查自己拥有的而不是大家共有的,则需要采用以下代码之中的方法

 <script>
        
        function User(name,age){
             this.name=name;
             this.age=age;
        }

        User.prototype.like='apple';
        let user=new User('jhon',18);

        alert('like'in user);//true
        alert(user.hasOwnProperty('like'));//false

   </script>

六:Symbol
根据规范,对象的属性键只能是字符串类型或者 Symbol 类型。不是 Number,也不是 Boolean,只有字符串或 Symbol 这两种类型
(1)
“Symbol” 值表示唯一的标识符。
例如:let id=Symbol();//括号内可以加入描述,但是影响不大,如果两个都是相同描述也没有问题。
例如:let id=Symbol(‘id’); let id2=Symbol(‘id’);
(2)
js内有很多的支持字符串隐式转换,例如alter()
但是Symbol特殊,它不会被自动转换
let id=Symbol();
alter(id);//为显示错误,类型错误
如果想要显示Symbol则需要以下:
alter(id.toString())或者
alert(id.description);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值