创建对象的几种方式
2015-09-23 12:27
351 查看
1,使用Object构造函数
var person = new Object(); person.name = "你好"; person.age = 29; person.job = "software Engineer"; person.sayName = function(){ alert(this.name); }
缺点: 使用同一个接口创建很多对象,会产生大量的重复代码。
2,工厂模式
function creatPerson(name,age,job){ var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function(){ alert(this.name); } return o; } var person1 = createPerson("nn",30,"程序员"); var person2 = createPerson("bb",45,"boss"); person1.sayName(); // 程序员
优点: 可以解决上个创建多个相似对象的问题。
缺点: 无法解决对象识别的问题
3,构造函数模式
function Person(name,age,job){ this.name = name; this.age = age; this.job = job; this.sayName = function(){ alert(this.name); } } var person1 = new Person("Nicholes",34,"Software Engineer"); person1.sayName(); //Nicholes
优点: 自定义的构造函数意味着将来可以将它的实例标识为某一种特定的类型;换句话说就是可以识别对象类型。
缺点: 每个方法都要在每个实例上重新创建一遍,浪费内存空间。
4,原型模式
function Person(){} Person.prototype.name = "你好"; Person.prototype.age = 23; Person.prototype.sayName = function(){ alert(this.name); } var person1 = new Person(); person1.sayName(); //你好
优点: 具有封装性,通过构造函数创建的实例可以共享原型对象上的属性和方法。
缺点: 没有私有属性和方法
5,组合使用构造函数模式和原型模式
function Person(name,age,job){ this.name = name; this.age = age; this.job = job; this.friends = []; } Person.prototype.sayName=function(){ alert(this.name); } var person1 = new Person("Nichloas",45,"公务员"); var person2 = new Person("hh",45,"程序员"); person1.friends.push("nij"); person2.friends.push("jiek"); alert(person1.friends); //nij alert(person2.friends); //jiek
优点: 构造函数用于定义实例的私有属性,而原型对象用于定义共有属性和方法,这样即最大的节省了内存空间,又区别于其他实例对象。
6,动态原型模式
function Person(name,age,job){ this.name = name; this.age = age; this.job = job; //方法 if(typeof this.sayName != "function"){ Person.prototype.sayName=function(){ alert(this.name); } } } var person = new Person('nh', 19, 'gcs');
优点: 为了适应那些经常使用OO开发语言的人
7,寄生构造函数模式
结构和工厂模式一样,但是包裹在外面的函数,是构造函数需要 new 一个实例function creatPerson(name,age,job){ var o = new Object(); o.name = name; o.age = age; o.job = job; o.sayName = function(){ alert(this.name); } return o; } var person1 = new createPerson("nn",30,"程序员");
优点: 可以在特殊情况下用来为对象创建构造函数
8,稳妥构造函数
类似于寄生构造函数,但是不直接把参数赋值给对象。function creatPerson(name,age,job){ var o = new Object(); o.sayName = function(){ alert(name); } return o; } var person1 = new createPerson("nn",30,"程序员"); console.log( person1.name ) // undefined
优点:外部无法通过实例对象访问到里面的 属性值。
总结
创建对象的方式大概就这些,其中最常用的也是默认的方式是组合模式。其它模式各有优缺点。当然,对于原型模式可能有些人不理解,可以去看 《javascript 高级程序》里面讲解的很清楚,也可以看我的博文
理解原型对象-构造器和实例的关系
相关文章推荐
- *Unique Binary Search Tree
- Jesus Is Here
- app后端开发五:Xampp下配置https服务
- Codeforces Round #321 (Div. 2) E. Kefa and Watch 线段树hash
- hadoop学习笔记(九)——hadoop日志分析系统
- 关联规则(一)Apriori算法
- SOAP Web 服务介绍
- HTML <form> 标签的 enctype 属性
- 服务器如何打开ping命令
- 全面讲解Tomcat下SSL证书的配置(三)
- swift 基本数据类型--字符串
- 2015-09-23学习笔记
- JPA-DATA学习
- Android Fragment
- mock probability with lottery
- django拾遗之signal
- Sql Server 跨服务器查询
- mysql5.6编译安装详解
- 非常有意思的策略地址转换故障排查
- 升级Xcode7-directory not found for option