对象的创建
- 字面量
- 内置构造函数(Object)
- 工厂函数
- 自定义构造函数
- Object.create()
01 字面量方式创建对象
代码示例
var book1 = {
name:"声名狼藉者的生活",
price:42.00,
author:"福柯",
press:"北京大学出版社",
read:function () {
console.log("我的书名为:声名狼藉者的的生活,作者为福柯....");
}
};
存在问题
- 代码复用性差
- 如果要创建大量的同类型对象,则需要些大量重复性代码
02 内置构造函数创建对象
-
内置构造函数
- String Number Boolean 注意:(区别于string number boolean)
- Date Array Function Object RegExp....
代码示例
var book1 = new Object();
book1.name = "声名狼藉者的生活";
book1.price = 42.00;
book1.author = "福柯";
book1.press = "北京大学出版社";
book1.read = function () {
console.log("我的书名为:声名狼藉者的的生活,作者为福柯....");
};
问题
01 创建的对象无法复用,复用性差
02 如果需要创建多个同类型的对象,如(书籍)则需要写大量重复的代码,代码的冗余度高
03 简单工厂函数创建对象
代码示例
function createBookNew (name,price,author,press) {
var book = new Object();
book.name = name;
book.price = price;
book.author = author;
book.press = press;
book.read = function () {
console.log("我的书名为:"+book.name+",作者为"+book.author+"....");
};
return book;
}
//使用工厂函数来创建对象
var book1 = createBookNew("声名狼藉者的的生活","42.00","福柯","北京大学出版社");
var book2 = createBookNew("人性的枷锁","49.00","毛姆","华东师范大学出版社");
var book3 = createBookNew("悟空传","28.00","今何在","湖南文艺出版社");
//打印对象的属性,调用对象的方法
console.log(book1.name);
console.log(book2.name);
console.log(book3.name);
book1.read();
book2.read();
book3.read();
工厂函数创建对象说明
工厂函数方法其本质就是对内置构造函数创建对象的一个封装,适用于大批量创建同种类型的对象
function createBook (name,price,author,press) {
//001 参数 = 原料
var book = new Object();
//002 创建对象并设置对象的属性和方法 = 对原料进行加工
book.name = name;
book.price = price;
book.author = author;
book.press = press;
book.read = function () {
console.log("我的书名为:"+book.name+",作者为"+book.author+"....");
};
//003 把处理好的对象返回给我们 == 产品出厂
return book;
}
封装思路
使用函数把固定不变的部分封装起来,变化的部分提取为函数的参数
工厂函数创建对象的实现过程
① 提供一个创建对象的函数(参数)
② 在该函数内部使用new 关键字和Object构造器创建对象
③ 设置对象的属性
④ 设置对象的方法
⑤ 返回对象
04 自定义构造函数创建对象
构造函数与普通函数的区别:
- 本质上没有区别
- 构造函数一般首字母大写
- 调用的时候,构造函数一般与new结合使用创建对象
核心过程:
01 提供一个(构造)函数
02 在函数通过this设置属性和方法
03 通过new 函数()创建对象
-
内部实现具体过程
- 默认在函数内部创建一个空对象 var o=new Object()
- 将创建的新对象赋值给this this=o
- 默认会把新创建的对象的原型对象设为当前构造函数的原型对象 o.proto=Person.prototype
- 默认会设置新创建对象的构造器属性为当前构造函数 o.proto.constructor=Person
- 通过this设置属性和方法
- 默认会把新创建的对象返回 return o
代码示例
function CreateBook (name,price,author,press) {
this.name = name;
this.price = price;
this.author = author;
this.press = press;
this.read = function () {
console.log("我的书名为:"+this.name+",作者为"+this.author+"....");
};
}
var b1 = new CreateBook("声名狼藉者的的生活","42.00","福柯","北京大学出版社");
var b2 = new CreateBook("人性的枷锁","49.00","毛姆","华东师范大学出版社");
var b3 = new CreateBook("悟空传","28.00","今何在","湖南文艺出版社");
//打印对象的属性,并调用对象的方法测试
console.log(b1.author);
console.log(b2.author);
console.log(b3.author);
b1.read();
b2.read();
b3.read();
console.log(b1 == b2); // false,创建的对象为引用类型,存储的是地址,两次创建对象,存储的地址不同,自然不相等
console.log(b1.read == b2.read); //false,同上
构造函数的返回值
01 如果在构造函数中没有显示的return,则默认返回的是新创建出来的对象
02 如果在构造函数中显示的return,则依照具体的情况处理
[01] return 的是对象,则直接返回该对象,取而代之本该默认 返回的新对象
[02] return 的是null或基本数据类型值,则返回新创建的对象
构造函数方式创建对象存在的问题
每次创建对象,都会重新创建函数,那么如果创建的对象数量很多,而对象方法内部的实现一模一样,则造成了资源浪费