构造函数及实例化原理、包装类

对象中的this

在对象里面this就代表对象本身
构造函数中的this
this指向实列化的对象
构造函数中的this,Car被实列化的时候就相当于普通函数被执行的时候这个时候Car也有自己的AO,AO里面默认的存了一个this对象

    /**
     * AO:{
     *  this:{
     * 
     * }
     * }
    */

函数被声明了如果没有被执行那么此时是不存在this的,也没有this指向问题,因为this是A0函数执行期上下文的一个属性
函数在执行的前一刻产生函数的AO执行期上下文,此时函数独立调用,因此函数中this指向window
如果是通过new关键字实例化构造函数呢?
通过new关键字对构造函数进行调用,此时构造函数内部的this,不在指向window,而是指向实列化对象,new关键字改变了构造函数内部的this指向

   function Car(color, brand){
        // this = {
            // color:color,
            // brand: brand,
        // }
        this.color = color;
        this.brand = brand;
        // return this; 隐式返回this
    }
    var car1 = new Car('red', 'Benz');
    var car2 = new Car('black','Mazda');

  function Car(){
        this.color = 'red';
        this.brand = 'kjjj';
        // 当构造函数中return的是引用值的时候, 实列不能访问到this里面的内容, {}[] function,其他的值不会影响
        //return '123';
        //return this 隐式返回的this
    }
    var car = new Car();
    console.log(car.color);

构造函数实例化出来的对象是否是同一个
不是,因为实例化构造函数时内部的this指向不同,因此实例化出来的对象也不一样,互不影响
new关键字的作用
没有new关键字的时候,函数的调用是独立调用,非严格模式下this指向window(严格模式是undefined),调用完以后默认隐式返回this
使用new关键字实例化构造函数的时候,构造函数会在内部隐式的生成一个this对象,并将构造函数的this指向这个空对象(并不是真正的空对象,里面有__proto__保存了构造函数的原型),当调用构造函数的时候,构造函数内部会为这个新对象赋值,最后把这个this对象隐式返回
模拟new关键字在构造函数中的作用
重点:new的作用就算创建空对象,并返回操作后端对象

function Car(color, brand) {
  var mThis = {};
	mThis.color = color;
    mThis.brand = brand;
  return mThis;
}

包装类

原始值没有自己的方法和属性,因此给原始数据类型设置属性和方法是不行的,即使取访问原始值数据的属性的结果也是undefind
但是字符串也是原始值为什么可以打印length属性呢?
这是由于JS中的包装类

JS包装类有三种
n e w N u m b e r ( ) ; n e w S t r i n g ( ) ; n e w B o o l e a n ( ) ; \color{#fd9080}new Number(); new String () ;new Boolean(); newNumber();newString();newBoolean();
JS包装类包装数据的过程
一开始a中保存的是原始类型数字123,尝试给a添加属性len,赋值为3,可是原数值没有属性和方法,但是JS引擎为了能够让程序正常指向,就将原始数据类型数字123利用包装类进行包装 new Number(123),此时数字1就算对象的形式了,然后在对象中添加属性len,但是new Number(123)不会对变量进行接收,所以JS无法保存new Number(123).len所以就通过delete将属性删除,所以最后打印a.len就是undefined

var a = 123;
a.len = 3;
//new Number(123).len = 3 delete
console.log(a.len);//undefined

var str = 'abc';
//访问的是本身就有的属性,new String(str).length 不需要保存
console.log(str.length);//3

数字一定是原始值嘛? 不一定

var a = 1;//原始值
var b = new Number(a);//new Number()以后实例化出一个对象数字
console.log(b);

包装类参与运算的时候,例如new Number(123) + 3,此时会触发数字类型的隐式转换,进行计算
undefined和null不能设置任何的属性和方法

var test = new Number(undefined);
console.log(undefined.length);//报错
console.log(null.length);//报错

在这里插入图片描述

数组可以被length截断,字符串不行
为什么字符串不行?因为字符串是原始值,如果对原始值设置str.length = 2,JS引擎会使用包装类将str转换为new Stirng(str).length = 2,但是new Stirng不会对length进行接收,这个属性就会被delete删除,而打印的时候console.log(new String(str).length)时,作为转换成对象的变量str来说,字符串对象就有length属性,所以打印出3;

var arr = [1, 2, 3, 4, 5, 6];
arr.length = 3;
console.log(arr);//[1, 2, 3]

var str = 'abc';
str.length = 1;//new String(str).length = 1 delete
console.log(str.length);//任然是3

str.charCodeAt(index)
参数:index一个大于等于0,小于字符串长度的整数。如果不是一个数值,则默认是0。如果小于0,等于或者大于字符串长度,返回NaN。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值