`
zccst
  • 浏览: 3293101 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[Object]面向对象编程(高程版)(一)工厂和构造函数模式

 
阅读更多
作者:zccst

思路:工厂模式-->构造函数-->原型模式

一、工厂方法
createPerson(name ,sex, age){
    var o = new object();
    o.name = name;
    o.sex  = sex;
    o.age  = age;
    o.sayName = function(){
       return this.name;
    }
    return o;
}


存在问题:没有解决对象识别问题,即怎样知道一个对象的类型。

二、构造函数方式
构造函数可用来创建特定类型的对象。像Object和Array这样的原生构造函数,在运行时会自动出现在执行环境中。此外,也可以创建自定义的构造函数,从而定义自定义对象类型的属性和方法。
function Person(name,age,job)
{
	this.name = name;
	this.age  = age;
	this.job  = job;
	this.sayName = function(){
		alert(this.name);
	}
        //本质是 new function(){};每一个对象都不能共用
}
var p1 = new Person('Nicholas', 27, 'soft');
var p2 = new Person('zhao' , 26, 'ps');
p1.sayName();
p2.sayName();

构造函数的特点(与工厂方法的不同之处有)
(1)没有显示地创建对象
(2)直接将属性和方法赋给了this对象
(3)没有return 语句。
(4)首字母大写Person

使用new调用构造函数,实际会经历四个步骤:
(1)创建一个新对象
(2)将构造函数的作用域赋给新对象(this指向了这个新对象)
(3)执行构造函数中的代码(为这个新对象添加属性)
(4)返回新对象


前面p1和p2分别保存着Person的一个不同的实例。这两个对象都有一个constructor属性,该属性指向Person
alert(p1.constructor);//把Person对象打印一遍。
alert(p1.constructor == Person);//true
对象的constructor属性最初是用来表示对象类型的,但是instanceof操作符更可靠。
alert(p1 instanceof Person);//true
alert(p1 instanceof Object);//true

优点:创造自定义的构造函数意味着将来可以将他的实例标识为一种特定的类型;而这正是构造函数胜过工厂模式的地方。
存在问题:构造函数的问题是创建多少次,解决有多少个副本。不同对象间完全没有关系。缺点是:不能复用。

备注,这种方式定义的构造函数是定义在Global对象的。


1,将构造函数当成函数
构造函数与其他函数的唯一区别,就在于调用他们的方式不同。不过构造函数毕竟也是函数,不存在定义构造函数的特殊语法。任何函数,只要通过new操作符来调用,那他就可以作为构造函数;而任何函数,如果不通过new操作符来调用,那它跟普通函数也不会有什么两样。例如,前面例子定义的Person()函数可以通过下列任何一种方式来调用

//当构造函数使用
var person = new Person("Nicholas",29,"Software Engineer")
person.sayName(); //Nicholas

//作为普通函数使用
Person("Nicholas",29,"Software Engineer")
window.sayName(); //Nicholas

//在另一个对象作用域调用
var o = new Object();
Person.call(o, "Kristen", 25, "Nurse");
o.sayName(); //Kristen

最上面是构造函数的典型用法

2,构造函数的问题
主要问题是,每个方法都要在每一个实例上重新创建一遍。
function Person(name,age,job)
{
	this.name = name;
	this.age  = age;
	this.job  = job;
	this.sayName = new Function(){//与声明函数在逻辑上是等价的
		alert(this.name);
	}
}

从这个角度来看构造函数,更容易明白每个Person实例都包含一个不同的Function实例的本质。如下代码可以证明这两个函数是不相等的。
alert(p1.sayName == p2.sayName); // false;

然而,创建两个完全同样任务的Function实例确实没有必要,况且还有this对象在,根本不用在执行代码前就把函数绑定到的特定对象上。因此,大可像下面这样,
主要问题是,每个方法都要在每一个实例上重新创建一遍。
function Person(name,age,job)
{
	this.name = name;
	this.age  = age;
	this.job  = job;
	this.sayName = sayName;
}

function sayName(){
	alert(this.name);
}
var p1 = new Person('Nicholas', 27, 'soft');
var p2 = new Person('Greg' , 26, 'ps');     
alert(p1.constructor == Person);//true
alert(p2.constructor == Person);//true
alert(p1.sayName == p2.sayName); //true;

把sayName()函数的定义转移到了构造函数外,构造函数内的this.sayName 设置为全局作用域的 sayName;,尽管解决了两个函数做同一件事的问题。
可新问题又来了,在全局作用域中定义的函数实际上只被某个对象调用,这让全局作用域有点名不副实。而更让人无法接受的是:如果对象需要定义很多方法,那么就要定义很多个全局函数,于是我们这个自定义的引用来写就丝毫没有封装性可言了。好在这些问题都可以通过使用原型模式来解决。
分享到:
评论

相关推荐

    JS面向对象编程基础篇(一) 对象和构造函数实例详解

    本文实例讲述了JS面向对象编程对象和构造函数。分享给大家供大家参考,具体如下: 面向对象编程(Object Oriented Programming,缩写为 OOP)是目前主流的编程范式。它将真实世界各种复杂的关系,抽象为一个个对象,...

    src.zip Java的面向对象编程·讲解代码

    通过这段代码源码资源,目标是提供一个清晰而易懂的示例,帮助学习者更好地理解Java中的面向对象编程原则和概念。它将演示如何创建类和对象,如何定义和使用继承关系,如何利用封装实现数据隐藏,以及如何利用多态...

    Javascript面向对象编程(三) 非构造函数的继承

    今天是最后一个部分,介绍不使用构造函数实现”继承”。 一、什么是”非构造函数”的继承? 比如,现在有一个对象,叫做”中国人”。 代码如下: var Chinese = { nation:’中国’ }; 还有一个对象,叫做”医生”。 ...

    Python基础课程-面向对象编程.pdf

    Python基础课程-⾯向对象编程 Python⾯向对象编程 ⾯向对象编程 在本⽂中,您将学习Python中的OOP的以下基本概念: Python类 对象实例 定义和使⽤⽅法 OOP继承 什么是⾯向对象编程( 什么是⾯向对象编程(OOP)?...

    OOP:使用p5.js进行游戏开发的面向对象编程(OOP)

    p5.j​​s用于游戏开发的面向对象编程(OOP) 在本课程中,我们使用JavaScript库及其Java版本 。 以下是课程步骤: 课程步骤 步骤1:一个实例 一实例+功能向右移动。 。 步骤2:两个执行个体 两个实例+函数向右...

    GLAU_BCSC0002:这是GLA大学2019面向对象编程BCSC0002课程的官方资源库

    GLA大学,2019面向对象编程(BCSC0002)与面向对象的编程实验室(BCSC0801) 该存储库将存储与此课程相关的所有内容。教学大纲模块1 面向对象的编程功能:抽象,封装,继承和多态性,过程范式与面向对象范式,使用...

    python基础2.0版(6)— 面向对象第一部分

    文章目录思维导图一、面向对象编程二、面向对象和面向过程区别1.面向过程(Procedure Oriented)思维2.面向对象(Object Oriented)思维3.面向对象和面向程的总结三、对象的进化四、类的定义五、构造函数__init__()1...

    java面向对象程序设计.pptx

    教学目标 理解数据抽象和数据隐藏 创建类 能够创建和使用对象 能够控制对实例变量和方法的访问 方法的重载 构造函数的使用 理解this引用的用法 理解Java的垃圾收集机制 static方法和域的使用 类的组合 包的创建和...

    【05-面向对象(下)】

    •接口与简单工厂模式、命令模式等。 内部类 •我们把一个类放在另一个类的内部定义,这个定义在其他类内部的类就被称为内部类,有的也叫嵌套类,包含内  部类的类也被称为外部类有的也叫宿住类。 ...

    PHP 面向对象技术(全面讲解).txt

    面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程 架构,OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成,OOP 达到了软件工程的三个目标:...

    深入理解JavaScript系列.chm

    18.面向对象编程之ECMAScript实现 19.求值策略 20.《你真懂JavaScript吗?》答案详解 21.S.O.L.I.D五大原则之接口隔离原则ISP 22.S.O.L.I.D五大原则之依赖倒置原则DIP 23.JavaScript与DOM(上)——也适用于新手 24....

    java设计模式CatalogDAOFactory是典型的工厂方法

    面向对象的封装(Encapsulation)和分派(Delegation)告诉我们,尽量将长的代码分派“切割”成每段,将每段再“封装”起来(减少段和段之间偶合联系性),这样,就会将风险分散,以后如果需要修改,只要更改每段,不会再...

    Javascript 面向对象编程(一) 封装

    《面向对象的Javascript》(Object-Oriented JavaScript) 《Javascript高级程序设计(第二版)》(Professional JavaScript for Web Developers, 2nd Edition) 它们都是非常优秀的Javascript读物,推荐阅读。 笔记...

    二十三种设计模式【PDF版】

    在真正可复用的面向对象编程中,GoF 的《设计模式》为我们提供了一套可复用的面向对象技术,再配合 Refactoring(重构方法), 所以很少存在简单重复的工作,加上Java 代码的精炼性和面向对象纯洁性(设计模式是 java 的...

    JavaScript中的 new 命令

    面向对象编程(Object Oriented Programming,缩写为 OOP)是目前主流的编程范式。 那么,“对象”(object)到底是什么? 对象是单个实物的抽象。 对象是一个容器,封装了属性(property)和方法(method)。 属性...

    Classes and Objects

    最全的php面向对象编程 <br>第一节 面向对象编程 第二节 对象模型 第三节 定义一个类 第四节 构造函数和析构函数 第五节 克隆 第六节 访问属性和方法 第七节 类的静态成员 第八节 访问方式...

    面向对象技术与UML课件及源代码-by 南邮-陈杨

    本书是中南大学精品教材建设中的一本特色教材,为高校计算机相关专业提供面向对象技术和UML的讲解。本书采用Java语言进行描述,针对Java技术标准编程进行详细的讲解,以简单通俗易懂的案例,逐步引领读者从基础到...

    JavaScript面向对象

    一、面向对象编程思想 面向对象不是语法,写代码时候的关注点在对象, 关注对象 – 怎么创建对象,怎么给对象添加属性和方法 可以实现封装 二、对象的创建方式 var obj = {} var obj = new Object() 批量创建相同...

    JavaScript面向对象的程序设计(犯迷糊的小羊)

    “面向对象编程”(Object Oriented Programming,缩写为OOP)本身是一种编程的思维模式,它把世界的一切看作是对象的集合,世界的运转就是靠一个个对象分工、合作的结果,体现一切皆“对象”思想; 而在程序设计...

    深入理解JavaScript系列

    深入理解JavaScript系列(18):面向对象编程之ECMAScript实现 深入理解JavaScript系列(19):求值策略 深入理解JavaScript系列(20):《你真懂JavaScript吗?》答案详解 深入理解JavaScript系列(21):S.O.L....

Global site tag (gtag.js) - Google Analytics