为什么说javascript的一切皆为对象, 首先我们先知道什么是对象?
在JavaScript中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象,例如字符串、数值、数组、函数等。
大家应该对Object并不陌生
- 它就叫对象
- 它是用来定义的对象,本身没有固定的属性和方法,开发者定义了才有
使用new运算符就可以创建一个对象,创建之后可以为其添加属性和方法:
let person = new Object()
person.name = '张三'
person.age = 18
person.say = function() {
console.log("我是方法")
}
基本类型存储的是值本身,但如果不论什么时候,值都只是值。但是,当需要的时候,基本类型的值就会被转化成对应的对象,又称“包装类型”。简单的说,就是被包装成了对象
比如 toString()
let x = 1
x.toString()
当运行的时候,会在内部经历三个过程:
- 创建Number类型的实例
- 调用实例方法toString()
- 摧毁实例【恢复它本来的身份,如果再给它添加属性或者方法是不会生效的】
创建实例的过程可理解为执行了这么一行代码
let x = new Number(1)
使其具备了和对象一样的可访问属性和可调用方法
Function
函数其实也是对象
每个函数都至少有两个属性:length和prototype,length表示函数命名参数的个数,prototype则并非函数独有,他是保存引用类型所有实例方法的地方
函数还有三个很有用的方法:call()、apply()、bind() ,这三个方法用于将函数调用时的this指向传给他们的对象。
var x = 1
let obj = {
x = 2
}
function getX(){
console.log(this.x)
}
let ObejectX = getX.call(obj)
ObejectX();
//输出的结果是2
其次就是构造函数,是一种特殊的方法,主要用来创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用,在创建对象的语句中,特别的一个类可以有多个构造函数,可根据其参数个数的不同或参数类型的不同来区分他们 即构造函数的重载
function Person(name,age){
this.name = name
this.age =age
}
var p1 = new Person('tom',18)
var p2 = new Person('ject',18)