js中利用函数创建对象的5种模式
2017-04-24 21:37
232 查看
工厂模式
模式如下:function cPerson(name,age){
var o=new Object();
o.name=name;
o.age=age;
o.sayName=function(){alert(this.name);};
return o;
}
var person=cPerson(“jack”,29);
缺点:没能解决对象识别问题,即person instanceof cPerson返回false。
构造器模式
模式如下:function Person(name,age){
this.name=name;
this.age=age;
this.sayName=function(){alert(this.name);};
}
var person=new Person(“jack”,29);
与工厂模式的区别:new创建,this指向创建的对象,并且会有一个constructor属性指向构造函数;
优点:解决对象识别问题;
缺点:实例对象同名函数不相等,无法实现共享(函数复用)。
解决方案:
1.将方法移至全局作用域,不过会污染全局函数(不推荐);
2.原型。
原型模式
利用的是函数的prototype属性模式如下:
function Person{}
Person.prototype.name=”jack”;
Person.prototype.age=29;
Person.sayName=function(){alert(this.name);};
所有实例对象共享原型中的属性和方法,原型中默认constructor属性指向构造函数。
A.prototype.isPrototypeOf(B):判断A的原型是不是B的原型;
Object.getPrototypeOf(A):获取A的原型。
代码访问属性时首相访问实例,若无,其次访问属性。
在实例中添加了一个与原型属性相同名字的属性,则有屏蔽作用。
检测实例对象是否有自己的属性:A.hasOwnProperty(“name”)。
使用in操作符检测实例或原型中是否具有该属性:“name”in A。
动态添加原型属性,无问题。动态重写整个原型对象,会切断构造函数与最初原型之间的联系。
例如:
function Person(){}
var friend=new Person();
Person.prototype={
constructor:Person,
name:”jack”,
age:20,
sayName:function(){alert(this.name);}
};
friend.sayName();//报错,实例对象指向最初的原型,没有指向重写的原型。
原型模式的问题:共享性导致,原型属性一变,所有实例会受到影响。
寄生构造函数模式
与工厂模式代码一致,不同的是创建对象时以new操作符创建对象。同样不能依赖instanceof识别对象类型。稳妥构造函数模式
与工厂模式相似,不同的是没有使用this。同样不能依赖instanceof识别对象类型。函数内定义的属性只能由函数内的方法访问。相关文章推荐
- 在立即执行函数内组合使用构造函数模式和原型模式创建对象,实现模块化开发(以daterangepicker.js为例)
- 【学习笔记六】 - js中 创建对象的模式与继承 及 js中实现块级作用域和函数私有变量 《js高程》6-7笔记
- js中组合使用构造函数模式和原型模式创建对象
- JS的特殊函数:构造函数,直接创建对象
- js创建对象的模式介绍
- 浅谈 JS 创建对象的 8 种模式
- JS面向对象程序设计之创建对象模式
- js创建对象之设计模式
- js中组合使用构造函数模式和原型模式创建对象
- js入门·循环与判断/利用函数的简单实例/使用对象/列举对象属性的名称
- 类里边的构造函数可以被private修饰,在类的内部创建对象。利用这种特性创建单类模式
- 自己在项目中的学习总结:利用工厂模式+反射机制+缓存机制,实现动态创建不同的数据层对象接口
- JS创建对象的七大模式
- js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
- 函数项目【COCOS2DX-LUA 脚本开发之十二】Hybrid模式-利用AssetsManager实现在线更新脚本文件lua、js、图片等资源(免去平台审核周期)函数项目
- 【JS】JavaScript中对象的创建与原型模式
- javascript创建对象之函数构造模式和原型模式结合使用(四)
- js 创建对象的三种方式——工厂模式、构造函数模式、原型模式
- 浅谈 JS 创建对象的 8 种模式
- js入门·循环与判断/利用函数的简单实例/使用对象/列举对象属性的名称