javascript 对象、包装类

对象

对象的创建方法

1:对象字面量 属性和属性名之间用 :号

        var obj = {
           ... // 属性 : 属性值
        }

2:构造函数
分为两种
(1)、系统自带

var obj = new Object(); 
var obj = new Array(); 
var obj = new Number(); 
var obj = new String(); 
var obj = new Boolean(); 
var obj = new Date(); 

(2)、自定义 属性和属性名之间用 = 号

function Func(){
	... // 属性 = 属性值
}

人为规定(不强制)构造函数名大写,即用小写,使用 new 也能当构造函数使用

//大驼峰式命名规则: TheFirstPerson
//小驼峰式命名规则: theFirstPerson

(3)、用对象创建函数

var obj = Object.create(原型);

注意,括号里必须是个对象,否则报错
在这里插入图片描述
错误信息显示:一个对象的原型只能是一个对象 或者 null
在这里插入图片描述
null 创建出的对象是没有原型的,null 是没有原型的

举例:

var obj = {
	...
}
var obj1= Object.create(obj)
//obj1的原型就是obj

使用构造函数构造对象时,必须使用 new ,如

function Person(){
	... // 属性 = 属性值
}
var person = new  Person();
//不用 new 的话就等于正常将函数的执行结果赋值给person

并且,使用了new ,只能返回对象,举个例子

<script>
    var Mobile = function(name,price){
        this.brand='华为';
        this.name=name;
        this.price=price;
        this.getInfo=function(){
            return this.brand+": "+this.price;
        };
        return {};//显式地返回一个空对象
    }
    var phone = new Mobile('p10',1000);
</script>

在这里插入图片描述
此时返回的是显式返回的对象,也就是上面的空对象
但是如果换成原始值,如下:

<script>
    var Mobile = function(name,price){
        this.brand='华为';
        this.name=name;
        this.price=price;
        this.getInfo=function(){
            return this.brand+": "+this.price;
        };
        return 123; //换成原始值
        //return {};//显式地返回一个空对象
    }
    var phone = new Mobile('p10',1000);
</script>

在这里插入图片描述
返回的还是 this ,所以,如果显式返回的是原始值,会被忽略,仍然返回隐式的 this

构造函数内部原理

  1. 在函数体最前面隐式的加上 this = {}
  2. 执行 this.xxx = xxx
  3. 隐式的返回 this
一个例子掌握属性的增、删、改、查
<script>
    var Mobile = function(name,price){
        //1、声明了一个this对象,声明是自动的
        // var this={};注意,这是不被执行的,只是为了演示
        //2、给这个新生成的this对象添加自定义的成员(属性/方法)
        this.brand='华为';
        this.name=name;
        this.price=price;
        this.getInfo=function(){
            return this.brand+": "+this.price;
        };
        //  3、返回这个新生成的对象 this 也是默认的
    }
    var phone = new Mobile('p10',1000);
    var phone1 = new Mobile('p20',3000);
</script>

在这里插入图片描述增、查、改都一样,采用属性访问符号 . 而删除,用 delete 对象实例.属性名 即可删除该对象实例的该属性例子:
在这里插入图片描述

原始值和对象

数字、字符串、布尔值
数字分两种(字符串、布尔类型也完全一致):数字原始值 和 数字对象,两者是不一样的,对象有属性和对应的属性值,也能有对象有的属性增删改查方法,像对象一样正常操作,而原始值是没有属性的,所以,通过下面两种方法产生的数字是不一样的。

var a = 10;
var num = new Number(5)

在这里插入图片描述

在这里插入图片描述
数字对象可以正常进行运算,在进行运算之后,就变成了原始值,注意是进行运算之后,num2回车,只是单纯的打印出num2的值,此时num类型还是对象,而num*=2,则是将num赋值为20,此时num 就变成了原始值,跟 num=20没区别,变成原始值,所以不能增加属性了,所以最后打印num还是输出一个原始值。

小知识点

null和undefined是没有属性的,也不能进行属性增删改查等操作
在这里插入图片描述

包装类

		var num = 4;
        num.len = 3;

在这里插入图片描述
原始值是没有属性的,为什么没报错,说明是可以访问的,为什么?

//包装类
var num = 4;
num.len = 3;
// var num = new Number(4).len = 3  会新建一个数字对象,并将其 len属性值赋值3     然后会销毁,注意是销毁了
此时在控制台访问 num.len 就相当于下面语句
console.log(num.len)
但是num是原始值,是没有属性的,所以不能访问,所以又会进行包装类,新建对象进行访问
// new Number(4).len 
注意,之前那个包装类的新建对象已经销毁了,此时又是一个新的包装类新建对象,
只是单纯的访问,访问一个没有的属性,所以返回 undefined
数组的截断,对数组长度属性重新赋值,可截断数组

在这里插入图片描述
这种截断方法,是对数组本身进行操作,不是返回一个新的数组

从数组 到 字符串
        var str = "hello";
        str.length = 2;
        
        //原始字符串没有属性,想访问length,系统进行包装类
        //new String('hello').length
        console.log(str.length);
        //控制台输出结果为5,为什么不是undefined?
        //因为字符串对象本身就有 length属性,而上面那个例子的 num.len 输出 undefined
        是因为字符串对象本身就有 length属性,而数字对象本身没有 len属性
迷惑人的一道题
    <script>
        var str = 'abc';
        str += 1;
        var test = typeof(str);
        if(test.length == 6){
            test.sign = "to be wonderful";
        }
        console.log(test.sign);
        //输出结果为 undefined
    </script>

条件语句内部完全没必要看,抓住核心,test = “String” 是个字符串原始值,然后没有属性,想要访问属性sign,于是包装类过程新建一个字符串对象,但是字符串对象本身是没有 sign 属性的,访问一个自身没有的属性,结果肯定是 undefined啊!
so ,理解核心过程!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值