【JS】五分钟理解对象 构造函数 包装类

[什么是对象]

W3school 给出的解释是

JavaScript 中的所有事物都是对象:字符串、数字、数组、日期,等等。

在 JavaScript 中,对象是拥有属性和方法的数据。

var obj={
   a:123,
   b:234,
   say:function(){
         console.log('hello')
   }
}

这是一个典型的js对象,他有着对象的属性和方法,对象的属性和方法都是可读可写的。

[对象的创建方法]

1.对象字面量

也就是我之前举的那个例子 var obj={}

2.构造函数

 1)系统自带的构造函数Object()

var obj =new Object();
obj.name='haha';
obj.sex='male'

2)自定义的构造函数

a.构造函数和函数在结构上没有区别,但是规定构造函数必须按照大驼峰式的命名规则。

function Person(){
   this.name='haha',
   this.sex='male'
}

b.构造函数需要创建对象必须借助new操作符

var person1=new Person();
var person2=new Person();

person1和person2长的一模一样,但是是两个完全独立的对象,有着不同的地址。

c.构造函数和普通函数一样可以传参 

 
 
function Person(name,sex){
   this.name=name,
   this.sex=sex,
}

var person =new Person('hehe','female')

我们发现构造函数和普通函数其实并没有区别,那么为什么它可以创造对象呢,关键就在于那个new操作符上,new之后,js引擎会将其视作构造函数,并进行以下几步隐式操作;

1.在函数体最前面隐式的添加一个this对象 var this={};

2.执行this.xxx=xxx;

3.隐式的返回this

function Person(name,sex){
   //var this={}
   this.name=name,
   this.sex=sex,
   //return this;
}

值得一提的是当你new了之后它就不是普通函数了,你会发现当你在函数体内 自定义一个return时,js引擎会宣选择忽略而继续执行return this

[包装类]

我们在学习js的过程中,一定听过一句话,叫一切皆对象,包括上文提到的W3school也提到了这一点,这曾经让我充满疑惑,我们在学习js类型时知道,js数据分为原始值和引用值,原始值是不可改变的,且它不能拥有属性和方法,那么我们为什么称其也是对象呢?

这就需要引入一个包装类的概念,先看下面的一个常见的例子

var str =‘abcd’;
console.log(str.length);

我们都知道这并不会报错,而且还会输出4,这是为什么呢?

我们知道js引擎是非常仁慈的,它能不你报错就不给你报错,当你调用str.length时,它会帮助你在之前将str进行隐式转化, var str =new String(‘abcd’),将它转变成对象类型的字符串 这个对象是临时对象,当结束时会销毁,而这个临时对象上的属性也会消失。

var str ='abcd';
str.length=2;
console.log(str);

//abcd

这些隐时调用的过程就是包装类。

再插一句,我们会发现null和undefined作为原始值的一员,他们是不是对象呢,它们并没有相应的构造函数进行转换,我们typeof(null)会发现它是object,但是他们都不可以有属性,因此我不认为两者是对象的一员。


猜你喜欢

转载自blog.csdn.net/timcope/article/details/80202526
今日推荐