文章目录

  • 自定义构造函数
  • 工厂模式
  • 构造函数模式
  • 原型模式
  • 构造函数+原型组合模式
  • es6的class声明


自定义构造函数

定义就不在这里说明了,说说实例化后对象的一些事项。

查看自己身上是否有某个构造函数内部的属性(查看本身):

function Fn1(){
    this.name = "123";
}
var f1 = new Fn1();
alert(f1.hasOwnProperty("name")); //ture

检测对象和构造函数是否有关系(运算符),或者说是否是它的实例:

var arr = ""
console.log(arr instanceof Array); //false
// 类似obj.__proto__.constructor===

写构造函数有些地方需要注意的:

  • 对象的创建一定要在构造函数的后面,否则报错;
  • 内部自动返回新对象,不用return;
  • 构造函数中this指向实例,如果没有用构造函数去创建对象,此时的this指向window,且只是一个普通函数;

ps:如果实例化的时候不传参,可以忽略掉()直接var f1 = new Fn1

工厂模式

函数就好像是个工厂,按照工序去生产对象。在函数内部创建一个对象,加工,最后返回这个对象。

function createObejct(){
	let obj = new Object()  // 生成原材料,一个对象
	obj.name = 'nick' // 加工
	obj.run = function (){ // 加工
		return 'run'
	}
	return obj  // 出厂
}
let obj = new createObejct()

缺点:每new出的一个对象都是一个独立个体的对象,所以每个对象的方法并不是等同(==)的,造成内存浪费资源。

构造函数模式

就是以构造函数的形式去创建,要注意函数首字母需要大写,内部this指向执行new的对象。

function Person(){
	this.name = 'nick'
	this.run = function() {
		return 'run'
	}
}
let obj = new Person()

优点:在函数中不用new对象,不return。

缺点:同工厂模式。

原型模式

每创建一个函数都有一个prototype(原型)属性,这个原型属性指向一个“共享”对象(原型对象)。

function Person(){
	Person.prototype.name = 'nick'
	Person.prototype.run = function(){
		return 'run'
	}
}
let obj = new Person()

优点:new出来的对象都是原型对象的关联“复制体”,所以每个对象的方法是等同(==)的

缺点:由于“共享”特性,其中一个实例修改,其他对象都会被修改。

构造函数+原型组合模式

构造函数用来定义实例属性,原型用来定义和共享属性、方法。

function Person(name){
	this.name = name
}
Person.prototype.run = function(){
	return 'run'
}
let obj = new Person('nick')

优点:每一个实例有独立属性又有共享属性,方法。

缺点:每new一个对象都要初始化一次。

我们根据缺点可以对这个模式进行改造,将原型的方法写在函数内:

function Person(name){
	this.name = name
	if (typeof this.run != 'function') {
		Person.prototype.run = function(){
			return 'run'
		}
	}
}
let obj = new Person('nick')

通过内部的一个判断条件,使得后来new的对象都不用再初始化。

这种方式在es5中最常用。