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

- Javascript的简单类型包括
 

   1.数字 number

                JS不分整型与浮点型

                俩个浮点数相加,精度不够

         2.字符串 string

                字符串+数字最后还是会变成字符串

                字符串与字符串相连用+号运算符

                字符串是不可改变的,一旦字符串被创建,就无法改变。但可以运用+号运算符连接其他的字符串,从而得到新的字符串。

                字符串数字等,就如同java,c语言等的对象,拥有一些的方法。

         3.布尔值 boolean

         4.null

         5.undefined

                以上都是简单数据类型

                其他都是对象Function(函数)      Array(数组)都是对象

研究一下        前五个貌似是对象,因为他们拥有方法,但是但没事不可变的

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

-Javascript的对象字面量:

         对象字面量是花括号包含零或多个“键:值”对。并且允许出现在任何允许表达式出现的地方。

        1:对象是可嵌套的。

        例:

        var student={

        name:"龙傲天",

        sex:"男",

        hobby:"打豆豆",

        teacher:{

            chinese:"鲁迅",

            math:"六六六"

        }

    };

       2:检索字符串可以用 []或 . 进行检索,不过推荐用.进行检索

       例: student.teacher.chinese    //鲁迅

         或:     student["name"]

                1.若检索未定义的键值,则会返回undefined基础类型,若检索undefined值则会在浏览器报错

        依旧是上面的例子,

                检索:student.friend 会返回未定义 undefined

                若检索:student.friend.name 则会报错

                解决方法  student.friend && student.friend.name  通过&&运算符避免错误。

                2.若对对象中的数值进行增加或更改,同样使用[]或 .进行更改。

                例:

                        student.name='凤傲天';

                        student.num=1008611;

                或: student['name'] ='凤傲天'

                        student['num']=1008611;

                3.对象可以引用传值:

                例如:

           var x=student;

            x.num=10086;

            var num= student.num;

            nnn=12345678;

.        每次传递的是引用,改变nnn的值并不会影响到对象student的值

                 4.对象不能直接复制。

        例:var student1= student //

          student1.name="凤傲骄"

         最后student.name也变成了凤傲骄

        我们希望拷贝一份 student的属性给 studen1,赋值是最简单的做法,但是这并不是我们想要的结果。 因为这仅仅是将student , student1指向了同一对象,修改其一,会相互影响.

        怎么解决呢? 对象浅拷贝:

        

        var student1= {};

            for (var key in student) {

            student1[key] = student[key];

        }

            student1.name="凤傲骄";

   创建空对象,用循环依次给与相同的键值,类似于java语言。

3:原型创建对象(new Object()):

    // 使用new Object()构造对象创建对象
    var person = new Object();

     // 给person对象添加属性
    person.name = "jacke";
    person.age = 18;
    person.play = function(){
        console.log("爱好打羽毛球");
    };

    // 调用对象
    console.log(person); // {name: "jacke", age: 18, play: ƒ}

    person["play"](); // 爱好打羽毛球
    注意:用原型创建的对象不能进行更改,若要对对象进行更改,应避免使用原型。

    原型链:原型链类似于java当中的类,能够保证对象之间的联系。

   

原型初次认识:

        1.原型中的customer指向实例,而实例的prototype指向原型。每个对象都有一个_proto_属性,指向创建该对象的函数的prototype。

        1原型拥有constructor和proto属性,constructor指向它的那个构造函数,而proto用来储存被自己用作构造函数的对象,也就是说构造函数和原型对象是互相指向的关系。

       2 若一个原型拥有构造函数实例的过程,就会拥有prototype属性,这个属性能够储存同一的方法,避免用原型构建不同对象时候,不同对象拥有同一方法需要多次声明,只需要从原型中的prototype直接提取。

        例如

function Dog(name, color)

{ this.name = name

this.color = color

this.bark = () => { console.log('wangwang~') } }

const dog1 = new Dog('dog1', 'black')

const dog2 = new Dog('dog2', 'white')

创建了俩只不同的狗对象dog1,dog2他们拥有不同的名字和颜色,但是方法(也就是行为)是大致相同的,若每次构造对象,都重新创建这个方法,那么会大量浪费。因此js会将方法单独放在一原型的prototype中,并且让所有用原型的构造函数构造的来允许访问其prototype的值。

因此可以对上述代码进行优化:

function Dog(name, color) { this.name = name this.color = color }

Dog.prototype.bark = () => { console.log('wangwang~') }
 

        3.原型对象就是用来存放实例中共有的那部分属性。

        4.在JavaScript中,所有的对象都是由它的原型对象继承而来,反之,所有的对象都可以作为原型对象存在。

        5.访问对象的属性时,JavaScript会首先在对象自身的属性内查找,若没有找到,则会跳转到该对象的原型对象中查找。

        引用自:作者:cicec
        链接:https://juejin.cn/post/6844903567375990791
        来源:掘金

        

var stooge = {

    "first-name": "Jerome",

    "last-name": "Howard"

};

stooge['middle-name'] = 'Lester';

stooge.nickname = 'Curly';

//以上填充4个元素

if (typeof Object.beget !== 'function') {

     Object.beget = function (o) {

         var F = function () {};

         F.prototype = o;

         return new F();

     };

}

var another_stooge = Object.beget(stooge);


 

another_stooge['first-name'] = 'Harry';

another_stooge['middle-name'] = 'Moses';

another_stooge.nickname = 'Moe';

//以上填充3个元素

stooge.profession = 'actor';

//原型填充1个元素:因为本身another_stooge没有这个属性,所以到原型去寻找

another_stooge.profession    // 'actor'<br />

//如果本身有这个属性,就取这个属性

another_stooge.nickname    // 'Moe'

delete another_stooge.nickname;

another_stooge.nickname;    // 'Curly'

var another_stooge = Object.beget(stooge);运用原型创建的对象another_stooge,分别对first-name,middle-name赋值(原型中有的),并新增了一个nickname属性。

another_stooge.profession  当本身没有这个属性时,就会从原型查找,依次类推,直至终点,也就是所有对象的原型Object.prototype.如果没有查到,值便是undefined。

若本身如果本身有这个属性,就取这个属性

若删除了本身的属性,但是原型还有其属性,那么就会返璞归真,属性值会变为原型值,本身属性直接删除。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值