前面已经对JavaScript的面向对象程序设计作了简单的介绍,包括了对象的属性、对象的工厂模式、构造函数和原型等。通过介绍,这些创建对象的方法依然有不少优化和改进的地方。

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

  创建自定义类型的最常用方式就是使用组合构造函数和原型模式。构造函数用于定义实例属性,原型用于定义共享的属性和方法。每个实例都有自己的实例副本,同时又共享了原型属性和方法,节省了内存。还支持向函数传递参数。

  

 function Person(name,age,sex){
this.name=name;
this.age=age;
this.sex=sex;
}
Person.prototype={
constructor:Person,
getName:function(){
return this.name;
}
}
var person1 = new Person("jack",18,"man");
var person2 = new Person("helen",19,"woman");
console.log(person1.getName());//jack
console.log(person2.getName());//helen
console.log(person1.getName===person2.getName);//true

  上面的代码中,实例属性都是在构造函数中定义的。在原型中定义了contructor和getName方法,原型中的方法由所有的实例共享。14行和15行输出的结果不相同,因为实例属性定义再构造函数中,而16行输出true,则证明两个实例的getName指向同一个栈内存。

动态原型模式

  上面的例子中,我们将函数的声明和原型的定义是分开的。为了解决这一点,我们可以在构造函数中初始化原型。

  

 function Person(name,age,sex){
this.name=name;
this.age=age;
this.sex=sex;
if(typeof this.getName!="function"){
Person.prototype.getName=function(){
return this.name;
}
}
}
var person1 = new Person("jack",18,"man");
var person2 = new Person("helen",19,"woman");
console.log(person1.getName());//jack
console.log(person2.getName());//helen
console.log(person1.getName===person2.getName);//true

  上面的代码中,我们在构造函数中声明了属性以及原型的方法。但是我们在5行有判断,只有当函数不存在的时候才调用,避免了函数的多次调用。

寄生构造函数模式

  通常情况下,我们使用上面的几种模式已经可以满足多种创建对象的需求了。JavaScript还为我们提供了寄生构造函数模式。这种模式的基本思想是创建一个函数,该函数仅仅是用来封装对象的代码,并返回创建的对象。

 function Person(name,age,sex){
var obj =new Object();
obj.name=name;
obj.age=age;
obj.sex=sex;
obj.getName=function(){
return this.name;
}
return obj;
}
var person = new Person("jack",18,"man");
console.log(person.getName());//jack

  上面的代码使用寄生构造函数模式创建了对象person,上面的对象,除了用new 来构造对象外,其他的与工厂模式创建对象的过程是一致的。通过寄生构造函数模式创建的对象,与构造函数本身并没有关系,构造函数返回的对象与在构造函数创建的对象并没有关系。不能通过instanceof来确定对象的类型。

浅谈JavaScript的面向对象程序设计(三)的更多相关文章

  1. 浅谈JavaScript的面向对象程序设计(四)

    本文继续讲解JavaScript的面向对象程序设计.继承是面向对象语言中的一个基本概念,面向对象语言支持两种继承实现方式:接口继承和实现继承.接口继承只继承方法签名,而实现继承则继承实际的方法.但是在 ...

  2. 浅谈JavaScript的面向对象程序设计(一)

    面向对象的语言有一个标志,他们都有类的概念,通过类可以创建多个具有相同属性和方法的对象.但是JavaScript中没有类的概念,因此JavaScript与其他的面向对象语言还是有一定区别的.JavaS ...

  3. 浅谈JavaScript的面向对象程序设计(二)

    前面介绍通过Object构造函数或者字面量创建单个对象,但是通过这个的方法创建对象有明显的缺点:调用同一个接口创建多个实例,会产生大量的重复代码.怎么样解决? 工厂模式 工厂模式是软件工程领域经常使用 ...

  4. 浅谈JavaScript的面向对象和它的封装、继承、多态

    写在前面 既然是浅谈,就不会从原理上深度分析,只是帮助我们更好地理解... 面向对象与面向过程 面向对象和面向过程是两种不同的编程思想,刚开始接触编程的时候,我们大都是从面向过程起步的,毕竟像我一样, ...

  5. 浅谈javascript的面向对象思想

    面向对象的三大基本特性 封装(把相关的信息(无论数据或方法)存储在对象中的能力) 继承(由另一个类(或多个类)得来类的属性和方法的能力) 多态(一个对象在不同情况下的多种形态) 定义类或对象 第一种: ...

  6. [转载]浅谈JavaScript函数重载

     原文地址:浅谈JavaScript函数重载 作者:ChessZhang 上个星期四下午,接到了网易的视频面试(前端实习生第二轮技术面试).面了一个多小时,自我感觉面试得很糟糕的,因为问到的很多问题都 ...

  7. 浅谈javascript函数节流

    浅谈javascript函数节流 什么是函数节流? 函数节流简单的来说就是不想让该函数在很短的时间内连续被调用,比如我们最常见的是窗口缩放的时候,经常会执行一些其他的操作函数,比如发一个ajax请求等 ...

  8. 浅谈JavaScript浮点数及其运算

    原文:浅谈JavaScript浮点数及其运算     JavaScript 只有一种数字类型 Number,而且在Javascript中所有的数字都是以IEEE-754标准格式表示的.浮点数的精度问题 ...

  9. 浅谈 JavaScript 编程语言的编码规范

    对于熟悉 C/C++ 或 Java 语言的工程师来说,JavaScript 显得灵活,简单易懂,对代码的格式的要求也相对松散.很容易学习,并运用到自己的代码中.也正因为这样,JavaScript 的编 ...

随机推荐

  1. 含有通配符*的字符匹配(C语言)

    含有通配符的字符匹配,采用贪心算法 //1 -> true //0 -> false int IsMatch(const char* reg, const char *str) { int ...

  2. 【eclipse】使用说明

    一. 设置jdk版本 1. Window->Preferences->Java->Installed JREs,选择jdk安装目录: 2. Window->Preference ...

  3. vim的操作命令

    vim常用命令 在命令状态下对当前行用== (连按=两次), 或对多行用n==(n是自然数)表示自动缩进从当前行起的下面n行.你可以试试把代码缩进任意打乱再用n==排版,相当于一般IDE里的code ...

  4. 基于flask的网页聊天室(二)

    基于flask的网页聊天室(二) 前言 接上一次的内容继续完善,今天完成的内容不是很多,只是简单的用户注册登录,内容具体如下 具体内容 这次要加入与数据哭交互的操作,所以首先要建立相关表结构,这里使用 ...

  5. elasticsearch 中文 term & completion suggester

    Term suggester 创建索引 curl -XPUT 'http://172.16.125.136:9200/term?pretty'创建 mapping curl -XPOST http:/ ...

  6. DEV Express中ImageCollection的使用

    1,        ImageCollection作为窗体组件的一种,位于Components分类下,拖进窗体以后,显示在界面的底部. 2,        注意ImageCollection的Imag ...

  7. Android Ubuntu 12.04 源码环境搭建

    $ sudo apt-get install git gnupg flex bison gperf build-essential \ zip curl libc6-dev libncurses5-d ...

  8. 分享21个基于jquery菜单导航的效果

    jquery导航菜单插件制作jquery动画菜单熔岩灯菜单效果更新时间:02月15日 14:53:03 虾米精选-菜单导航-导航菜单 0浏览 / ★★★☆☆星级 / 未知软件大小/ jquery导航菜 ...

  9. python022 Python3 面向对象

    Python3 面向对象 Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的.本章节我们将详细介绍Python的面向对象编程. 如果你以前没有接触 ...

  10. 【Ts 2】Nginx服务器搭建

    在项目中,首先是需要Nginx服务器作为一个图片服务器来使用.那么,久涉及到服务器的搭建.这次服务器的搭建,主要是在三个环境上进行了学习:CentOS6.2,CentOS7,和Ubuntu16.那么本 ...