对象中的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。