- 工厂模式
理解:工厂模式就是批量化生产,但是存在的缺陷就是不知道对象的类型是什么,都是Object
function createBook(name,author,price) {
let book = {};
book.name = name;
book.author =author ;
book.price = price;
book.sayIt = function () {
console.log(this.name);
};
return book;
}
let book1 = createBook("愿有人陪你颠沛流离","lsh",35);
book1.sayIt();
- 构造函数模式
理解:创建自定义对象类型的属性和方法.重写上述模式
function Book(name,author,price) {
book.name = name;
book.author =author ;
book.price = price;
book.sayIt = function () {
console.log(this.name);
};
let book1 = createBook("愿有人陪你颠沛流离","lsh",35);
对比区别:
1.没有显示的创建对象;
2.直接将属性和方法赋给了this对象;
3没有return语句;
构造模式相关的问题:
//2.1将构造函数当做函数
//当作构造函数
let Book3 = new Book("qqq","www",90);//Book的一个实例
Book3.sayName();
//当作普通函数
// new Book("ww","dd",20);
// window.sayName();
//在另一个对象的作用域调用
let b = {};
Book.call(b,"ww","dd",20);
b.sayName();
但是构造函数模式也存在弊端
let Book1 = new Book("sad","ad",90);//Book的一个实例
console.log(Book1.author);
Book1.sayName();
let Book2 = new Book("aaa","sssd",30);
console.log(Book1.sayName === Book2.sayName); //false
解决办法:
将sayName()放到外部
this.sayName = sayName;(构造函数内部)
function sayName(){console.log(this.name);}
但是,这种做法将函数放在了全局,但是它又不符合全局作用域的性质,引用类型的封装性没有意义.解决方法在下一篇会有提到.
关于这一模块的学习是很有意思的,希望大家不要觉得困难,有疑惑互相帮助.