文章目录
- 自定义构造函数
- 工厂模式
- 构造函数模式
- 原型模式
- 构造函数+原型组合模式
- 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中最常用。