工厂模式

function createPerson(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('zy1',,'new worker');
var person2 = createPerson('zy2',,'new worker2');

工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别问题(即怎么样知道一个对象的类型)。因为全部都是Object,不像Date、Array等,因此出现了构造函数模式。

构造函数模式

function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = function(){
alert(this.name);
}
}
var person1 = new Person('zy1',,'new worker');
var person2 = new Person('zy2',,'new worker2');

构造函数模式与工厂模式比较有以下不同

  • 没有显式地创建对象
  • 直接将属性和方法赋给this对象
  • 没有return语句

这种方法创建的对象都有一个constructor属性,此例中指向Person,即 person1.constructor == Person


构造函数与普通函数的区别就在于调用的方式,即new出来的。如果不通过new操作,那它跟普通函数没有什么两样

构造函数的缺点:

构造函数中每个方法都要在每个实例上重新创建一遍,如果上面的person1和person2方法中sayName(),不是同一个Function实例。因为函数是对象,即每定义一个函数,也就是实例化一个对象。

即上面的等价 this.sayName = new Function("alert(this.name)")


上面的的方法也可以改成

function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayName = sayName
}
function sayName(){
alert(this.name)
}

但是这样sayName()就成为全局函数,很不好,所以引出下面的模式

原型模式

关于原型的具体见http://www.cnblogs.com/myzy/p/6083141.html这里就不解释了

使用原型好处是可以让所有对象实例共享它所包含的属性和方法。

function Person(){}
  Person.prototype.name = 'zy';
  Person.prototype.age='';
  Person.sayName = function(){
   alert(this.name);
  }
var person1 = new Person();
var person2 = new Person();
alert(person1.sayName == person2.sayName) //true

更简单的原型语法

function Person(){
}
Person.prototype = {
name:'zy',
contructor:Person,
age:,
sayName:function(){
alert(this.name);
}
}

注意,这里重新设置了contructor.因这如果不加contructor,这样方式创建的新对象,构造函数不再指向Person

缺点:如果一个实例修改了原型中的属性值,那么其他实例中这个属性值也会改变。

组合使用构造函数模式和原型模式

function Person(name,age,job){
this.name = name;
this.age = age;
this.friends=['a','b'];
}
Person.prototype = {
contructor:Person,
sayName:function(){
alert(this.name);
}
}

这种模式是使用最广泛的方法。

动态原型模式

function Person(name,age,job){
this.name = name;
this.age = age;
this.friends=['a','b'];
if(typeof this.sayName != 'function'){
alert(this.name);
}
}

其中if语句可以是初始化之后应该存在的任何属性或方法,不必用一大堆if语句检查每个语句和每个方法,只要检查其中一个即可。

寄生构造函数模式

function Person(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 Person('zy1',,'new worker');

这里了new操作符并把使用的包装函数叫做构造函数之外,这个模式和工厂模式其实是一模一样的。

稳妥构造函数模式

function Person(name,age,job){
var o = new Object();
o.sayName = function(){
alert(name);
}
return o;
} var person1 = Person('zy1',,'new worker');

这种方法不引用this,new。这种模式提供的这种安全性,使得它非常适合在某些安全执行环境。

js面向对象之创建对象的更多相关文章

  1. js面向对象 多种创建对象方法小结

    转自js面向对象 多种创建对象方法小结 1.对象字面量 var clock={ hour:12, minute:10, second:10, showTime:function(){ alert(th ...

  2. 浅谈JS面向对象之创建对象

    hello,everybody,今天要探讨的问题是JS面向对象,其实面向对象呢呢,一般是在大型项目上会采用,不过了解它对我们理解JS语言有很大的意义. 首先什么是面向对象编程(oop),就是用对象的思 ...

  3. js面向对象、创建对象的工厂模式、构造函数模式、原型链模式

    JS面向对象编程(转载) 什么是面向对象编程(OOP)?用对象的思想去写代码,就是面向对象编程. 面向对象编程的特点 抽象:抓住核心问题 封装:只能通过对象来访问方法 继承:从已有对象上继承出新的对象 ...

  4. JS面向对象之创建对象模式

    虽然Object构造函数或对象字面量都可以用来创建单个对象,但都有一个缺点,使用同一个接口来创建对象,会产生大量重复的代码,为解决这个问题,引出下列方法 1.工厂模式 抽象了创建具体对象的过程,用函数 ...

  5. js面向对象编程——创建对象

    JavaScript对每个创建的对象都会设置一个原型,指向它的原型对象. 当我们用obj.xxx访问一个对象的属性时,JavaScript引擎先在当前对象上查找该属性,如果没有找到,就到其原型对象上找 ...

  6. JS面向对象设计-创建对象

    Object构造函数和对象字面量都可以用来创建单个对象,但是在创建多个对象时,会产生大量重复代码. 1.工厂模式 工厂模式抽象了创建具体对象的过程.由于ECMAScript无法创建类,我们用函数来封装 ...

  7. js面向对象学习 - 对象概念及创建对象

    原文地址:js面向对象学习笔记 一.对象概念 对象是什么?对象是“无序属性的集合,其属性可以包括基本值,对象或者函数”.也就是一组名值对的无序集合. 对象的特性(不可直接访问),也就是属性包含两种,数 ...

  8. JavaScript---正则使用,日期Date的使用,Math的使用,JS面向对象(工厂模式,元模型创建对象,Object添加方法)

    JavaScript---正则使用,日期Date的使用,Math的使用,JS面向对象(工厂模式,元模型创建对象,Object添加方法) 一丶正则的用法 创建正则对象: 方式一: var reg=new ...

  9. JS面向对象(2) -- this的使用,对象之间的赋值,for...in语句,delete使用,成员方法,json对象的使用,prototype的使用,原型继承与原型链

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

随机推荐

  1. 解决魅族MX5卸载debug-app不干净,导致安装、升级不成功的问题

    环境:魅族MX5,Android 5.1 问题:开发app使用真机调试后,在桌面上拖动图标卸载app-debug.apk,然后安装签名版本的app-release.apk提示替换xxx版本,按确定后提 ...

  2. 一段关于测试和自定义Attribute的代码

    来自<西夏普入门经典> using System; using System.Collections.Generic; using System.Linq; using System.Te ...

  3. [转载]ARM协处理器CP15寄存器详解

    用于系统存储管理的协处理器CP15  原地址:http://blog.csdn.net/gameit/article/details/13169405 MCR{cond}     coproc,opc ...

  4. java @ResponseBody返回值中去掉NULL字段

    需要同时添加两个位置: 1.annotation-driven过滤 <mvc:annotation-driven> <mvc:message-converters register- ...

  5. yum:在Red Hat和Fedora中使用

    1.列出已安装包: yum list installed--------->输出的结果可能在屏幕上一闪而过.所以最好把已安装包的列表重定义到一个文件中.然后是使用more/less查看 yum ...

  6. 尝试打开或创建物理文件 REATE FILE 遇到操作系统错误 5(拒绝访问)

    尝试打开或创建物理文件 'E:\Library.mdf' 时,CREATE FILE 遇到操作系统错误 5(拒绝访问.). 最佳回答: 这是因为SQL Server的启动帐户(一般是system或某个 ...

  7. 使用智能指针来管理对象 (基于RAII)

    ////一个简单的防止内存泄露的例子//void test() { //使用RAII的特性管理资源 //当智能指针unique_ptr被销毁时,它指向的对象也将被销毁 //这里test函数返回后 p将 ...

  8. TP-link TL-WN725 USB无线网卡在DX2 CPU下的Xlinux 驱动移植

    网上查到,TP-link TL-WN725 USB无线网卡用的芯片是8188EU 下载驱动:http://download.csdn.net/detail/zzz_mraz/5262010 tar z ...

  9. 通过WMI接口监控服务器性能

    WMI 是微软操作系统的一个内置的组件,通过使用WMI我们可以获取服务器硬件信息.收集服务器性能数据.操作Windows服务,甚至可以远程关机或是重启服务器. 一.在C#编程中使用WMI 要想在C#程 ...

  10. Fragment笔记整理

    前言 一直在用Fragment,但是没有系统的整理过,Google了一下相关文章,看到了几篇,将几篇还不错的文章重点整理了下,很多是直接Copy的,只为做个笔记,以后翻来看比较方便,建议大家看一下下面 ...