工厂模式

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. 图像分割实验:FCN数据集制作,网络模型定义,网络训练(提供数据集和模型文件,以供参考)

    论文:<Fully Convolutional Networks for Semantic Segmentation> 代码:FCN的Caffe 实现 数据集:PascalVOC 一 数据 ...

  2. javascript 利用匿名函数对象给你异步回调方法传参数

    先来创建一个匿名函数对象: /*** * 匿名函数 */ var callChangeBtn=new function(bugBtn){ this.chage=function(json){ bugB ...

  3. Apache Tomcat 7 安装与配置

    下载 首先需要下载tomcat7的安装文件,地址如下: http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7.0.69/bin/apache-tomca ...

  4. asp.net mvc js 获取model值。

    cshtml页面部分代码: div class="col-sub">          @using (Html.BeginForm("SaveTTMallConf ...

  5. [2016.01.01]万峰文本处理专家 v2.0

    <万峰文本处理专家>是一款简单易用,且功能强大的各类文本文件处理软件.1.支持多任务的处理模式,允许一次处理多个任务.2.支持正则表达式替换,替换更加强大:3.支持各类关键字的行处理操作: ...

  6. Python入门5

    装饰器 装饰器英文Decorator,自身是一个函数,用来包装其它的函数,实现在不改变原来代码的情况下,增加新的功能,返回一个修改后的函数对象, 装饰器功能: 1.装饰器也是函数 2.在不改变原有代码 ...

  7. jquery.cookie() 的使用(原)

    jquery.cookie()是一个轻量级的cookie 插件,可以读取.写入.删除 cookie. 步奏: 1. 添加jQuery插件和jQuery.cookie插件 <script src= ...

  8. linux备份mysq脚本

    filename=`date +%Y%m%d_%H%M%S`database=finebwservername=officialcreatefilename=${servername}_${datab ...

  9. c# 进程间的通信实现之一简单字符串收发

       使用Windows API实现两个进程间(含窗体)的通信在Windows下的两个进程之间通信通常有多种实现方式,在.NET中,有如命名管道.消息队列.共享内存等实现方式,这篇文章要讲的是使用Wi ...

  10. 对话框AlertDialog.Builder使用方法

    我们在平时做开发的时候,免不了会用到各种各样的对话框,相信有过其他平台开发经验的朋友都会知道,大部分的平台都只提供了几个最简单的实现,如果我们想实现自己特定需求的对话框,大家可能首先会想到,通过继承等 ...