一、调用系统构造函数与字面量方式
我们可以直接通过 new Object()
创建:
var person = new Object(); //实例化对象
person.name = 'Jack';//添加属性
person.age = 18
person.sayName = function () { //添加方法
console.log(this.name)
}
每次创建通过 new Object()
比较麻烦,所以可以通过它的简写形式对象字面量来创建:
var person = {
name: 'Jack',
age: 18,
sayName: function () {
console.log(this.name)
}
}
二、工厂模式创建对象
上面两种写法本身没有问题,但是假如我们要生成两个 甚至多个person
实例对象呢?每次都重复定义会显得代码冗余,重复性太高。这里有一个简单的改进方法:工厂模式
function createPerson (name, age) {
return {
name: name,
age: age,
sayName: function () {
console.log(this.name)
}
}
}
然后直接调用生成实例对象:
var p1 = createPerson('Jack', 18);
var p2 = createPerson('Mike', 18);
工厂模式虽然能解决一次性多次创建对象的问题,但每次创建的对象都是系统自定义对象Object,即console.log(实例对象 instanceof Object)返回true,这样在实际应用过程中无法分辨对象具体属于哪个类型。
三、自定义构造函数创建对象
为了解决工厂模式存在的问题,这里引入了自定义构造函数
function Person (name, age) {
this.name = name
this.age = age
this.sayName = function () {
console.log(this.name)
}
}
四、对象在内存中的存储
4.1 js中简单数据类型的存储--值传递
js中的简单数据类型如string,number,boolean都是存于栈中
4.2 js中复杂数据类型的存储--引用(地址)传递
js中的复杂数据类型如Object(包括Function,Array等),它们的内容都是存于堆,而栈中存的是堆的地址,因此也叫地址传递:
tips:
①内存中的栈:自动分配内存空间,系统会自动释放,用于存放基本类型数据的值和引用类型数据的地址
②内存中的堆:动态分配内存空间,大小不定,不会自动释放,用于存放引用类型数据的值