[什么是对象]
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,但是他们都不可以有属性,因此我不认为两者是对象的一员。