工厂模式、构造函数模式、原型模式、构造函数模式+原型模式
时间:2019-09-05
本文章向大家介绍工厂模式、构造函数模式、原型模式、构造函数模式+原型模式,主要包括工厂模式、构造函数模式、原型模式、构造函数模式+原型模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
// 工厂模式 function Person(name,age) { let o = new Object(); o.name = name; o.age = age; o.say = function() { console.log(this.name); } return o; //记得返回对象 } let person1 = Person('kevin',18); let person2 = Person('kevin2',8); // console.log(person1 instanceof Person) //false 不能识别对象类型 // 可以无数次调用这个工厂函数,每次都会返回一个包含两个属性和一个方法的对象 // 工厂模式虽然解决了创建多个相似对象的问题,但是没有解决对象识别问题,即不能知道一个对象的类型 // 构造函数模式 function Person1(name,age) { this.name = name; this.age = age; this.say = () => { console.log(this.name) } } let person3 = new Person1('kevin',18); let person4 = new Person1('kevin2',8); // 没有显示的创建对象,使用new来调用这个构造函数,使用new后会自动执行如下操作 // 创建一个新对象 // 这个新对象会被执行[[prototype]]链接 // 这个新对象会绑定到函数调用的this // 返回这个对象
// 使用这个方式创建对象可以检测对象类型 // 但是使用构造函数创建对象,每个方法都要在每个实例上重新创建一次 // console.log(person3 instanceof Person1) // true 能够识别对象类型 // 原型模式 function Person2() {}; Person2.prototype.name = 'kevin'; Person2.prototype.age = 18; Person2.prototype.girlFirends = ['mimi','kiki'] Person2.prototype.say = () => { console.log(this.name); } let person5 = new Person2(); let person6 = new Person2(); person5.girlFirends.push('gigi'); // 将信息直接添加到原型对象上。使用原型的好处是可以让所有的实例对象共享它所包含的属性和方法,不必在构造函数中定义对象实例信息。 // 使用原型,所有的属性都将被共享,这是个很大的优点,同样会带来一些缺点 // 原型中所有属性实例是被很多实例共享的,这种共享对于函数非常合适。对于那些包含基本值的属性也勉强可以,毕竟实例属性可以屏蔽原型属性。但是引用类型值,就会出现问题了 // console.log(person5 instanceof Person2,person5,person6, person5.girlFirends === person6.girlFirends) //true, Person2 {}, Person2 {}, true // 构造函数模式 + 原型模式
// 属性写在构造函数模型中,方法写在原型模型中 function Person3(name) { this.name = name; this.girlFirends = ['mimi','kiki']; } Person3.prototype.say = () => { console.log(this.name) } let person7 = new Person3('kevin'); let person8 = new Person3('kevin2'); person7.girlFirends.push('gigi'); // console.log(person7,person8,person7 instanceof Person3) //Person3 {name: "kevin", girlFirends: Array(3)} Person3 {name: "kevin2", girlFirends: Array(2)} true // 这是使用最为广泛、认同度最高的一种创建自定义类型的方法。它可以解决上面那些模式的缺点 // 使用此模式可以让每个实例都会有自己的一份实例属性副本,但同时又共享着对方法的引用 // 这样的话,即使实例属性修改引用类型的值,也不会影响其他实例的属性值了
原文地址:https://www.cnblogs.com/kewenxin/p/11465743.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法