js两种生成对象模式(公有成员和成员私有)

假设有个需求,创建一个book类,有isbn码,书名,作者 ;可以对isbn进行数据完整性校验;--js设计模式

<script type="text/javascript">

/**
方案一,属性全部属于公有类型,用this创建
该方式可以在构造器中对数据的完整性进行检验的控制,但对其他人员会把什么值赋给该属性而不能进行数据完整性检验的控制;
**/

var Book = function(isbn,name,author){
  if(!this.checkIsbn(isbn)) throw new Error("不合法的isbn码");
  this.isbn = isbn;
  this.name = name || ‘没有名字‘;
  this.author = author || ‘没有作者‘;
}

 

Book.prototype={
  checkIsbn:function(isbn){
    /**
    专门用来检验isbn的数据完整性,以防在该类中其他方法中出错
    **/
    if(isbn||typeof isbn !=‘string‘){
      return false;
    }
  // 可以对isbn进行各种校验  ...............
},
display:function(){
  /** 展示书本的一些信息 用this.isbn,this.name展示信息**/
  }
}

/** 优化后的方案一,以后所有的访问采用接口方式访问,属性用存取器来访问(可以将每个属性设置 为取值器和设置器(get,set);通过设置器你可以对你的属性(isbn)在存取器中进行数据完整性校验);
但是这种访问并不是强制性的,得靠开发人员自觉遵守,还是可以直接修改属性的;**/
var BookInter = new Interface(‘BookInter‘,[‘getIsbn‘,‘setIsbn‘,‘getName‘,‘setName‘,‘getAuthor‘,‘setAuthor‘,‘display‘]);
var Book = function(isbn,name,author){
  this.setIsbn(isbn);//采用存取器来设置属性
  this.setName(name);
  this.setAuthor(author);
 }
Book.prototype = {
  checkIsbn:function(isbn){
    ........
  },
  getIsbn:function(){
    return this.isbn;
  },
  setIsbn:function(isbn){
    if(!this.checkIsbn(isbn))throw new Error("不合法的isbn码");
    this.isbn = isbn;
  },
  getName:function(){
    return this.name;
  },
  setName:function(){
    this.name = name || ‘没有名字‘;
  },
  getAuthor:function(){
    return this.author
  },
  setAuthor:function(){
    this.author = author || ‘没有作者‘;
  },
  display:function(){
    //..................
  }
};

/**
方案二,采用闭包的方式形成真真的私有属性和方法;javascript中的作用域是词法性的;函数运行在定义他们的作用域中,而不是
运行在调用他们的作用域中。子类不能访问父类的所有私有属性和方法。所以用闭包实现私用成员导致了‘继承破坏封装’;有子类的话尽量用
方案一
**/
var Book = function(newIsbn,newName,newAuthor){
  var isbn,name,author;//私有属性
  function checkIsbn(isbn){
    //私有访法
  }
  //有特权的方法(那些需要直接访问私有成员的方法才被设置为特权方法,特权方法太多占用内存,每个对象实例都包含了所有特权方法的副本)
  this.getIsbn = function(){
    return isbn;
  };
  this.setIsbn = function(){
    if(!checkIsbn(newIsbn)) throw new Error(‘非法的isbn码‘);
    isbn = newIsbn;
  };
  this.getName = function(){
    return name;
  }
  this.setName = function(newName){
    name = newName || ‘没有名字‘;
  }
  this.getAuthor = function(){
    return author;
  }
  this.setAuthor = function(newAuthor){
    author = newAuthor || ‘没有作者‘;
  }

  //构造器代码
  this.setIsbn(newIsbn);
  this.setName(newName);
  this.setAuthor(newAuthor);
};
//公有的
Book.prototype = {
  display: function(){//不需要直接访问私有属性,可以通过特权方法来访问
    /**展示书刊的一些信息**/
  }
}

</script>

时间: 2024-11-02 20:31:39

js两种生成对象模式(公有成员和成员私有)的相关文章

js两种定义函数、继承方式及区别

一:js两种定义函数的方式及区别 1:函数声明: function sayA() { alert("i am A"); } 2:函数表达式: var sayB = function() { alert("i am B"); } 区别:code 前者会在代码执行之前提前加载到作用域中,后者则是在代码执行到那一行的时候才会有定义 二:js两种继承方式及区别 对象冒充 临时属性 call() apply() 原型链 code 继承应选哪种 code 三:实例 js两种定义

TI_DSP_SRIO - 两种SRIO操作模式

DSP SRIO协议的逻辑层定义了操作协议和相应的包格式.DSP上SRIO支持的逻辑层业务(数据发送方法)主要是直接IO/DMA(Direct IO/ Direct Memory Access)和消息传递(Message Passing). ?直接IO/DMA模式是最简单实用的传输方式,其前提是主设备知道被访问端的存储器映射.在这种模式下,主设备可以直接读写从设备的存储器.可以硬件直接实现. ?消息传递模式则类似于以太网的传输方式,它不要求主设备知道被访问设备的存储器状况.数据在被访问设备中的位

JS两种方式访问对象属性

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body> <p> 有两种方式可以访问对象属性: </p> <p> 你可以使用 .property 或 ["property"]. </p>

以Attention Model为例谈谈两种研究创新模式

/* 版权声明:可以任意转载,转载时请标明文章原始出处和作者信息 .*/                                                     author: 张俊林 各位观众朋友好,也许此刻您刚打开电梯--.读这一篇之前,请您最好先拜读一下本篇的前传:文本处理中的Attention Model:是什么及为什么.因为那里有些背景知识需要交代. 话接上回书,在研读AttentionModel相关文献过程中,我再次深切感受到了科研中的两种创新模式:模型创新与应用创新

有关文件读取写入 和两种文件打开模式的理解

文件有两种打开模式:文本模式和二进制模式 当c语言程序对文件操作时,先以某种模式打开文件,建立一个缓存去(读写模式下两个):缓存区中有文件的控制信息,然后用I/O函数操作文件. 对于fread和fwrite函数,不管文件是以什么模式打开的,fread和fwrite只会原样复制原始数据,而其他函数可能会对原始函数进行转化. 之后我们再用应用程序打开文件,取决于应用程序对文件的解释. 先写到这,等以后更加深一步了解了再补充.

WordPress引入css/js两种方法

WordPress引入css/js 是我们制作主题时首先面对的一个难点,任何一款主题都要加载自己的css,js,甚至很有可能还需要加载Jquery文件,网上方法特多,说法不一,我们今天借鉴wordpress官方最新的twentysixteen主题来学习总结一下WordPress引入css/js各种常用方法,以及最优化的加载方法. 其实网上的N种方法总结起来就两种:一.模板文件header.php中直接引入文件二.在主题的functions.php中通过WP自带的函数wp_enqueue_scri

日期选择器(Query+bootstrap和js两种方式)

日期选择是在下拉列表中选择年.月.日,年显示前后的五年,12个月,日就是有30.31.29.28天的区别,随着月份的变而变 一.js方式的日期选择 (1)首先就是三个下拉列表了,点击年.月.日显示列表中的内容,这样就是要给这三个列表加"点击事件"onclick <select id="nian" onclick="biantian()"></select>年 <select id="yue" on

关于两种限流模式

流量预警和限流方案中,比较常用的有两种.第一种滑窗模式,通过统计一段时间内的访问次数来进行控制,访问次数达到的某个峰值时进行限流.第二种为并发用户数模式,通过控制最大并发用户数,来达到流量控制的目的.下面来简单分析下两种的优缺点. 1.滑窗模式 模式分析: 在每次有访问进来时,我们判断前N个单位时间内的总访问量是否超过了设置的阈值,并对当前时间片上的请求数+1. 上图每一个格式表示一个固定的时间(比如1s),每个格子一个计数器,我们要获取前5s的请求量,就是对当前时间片i ~ i-4的时间片上计

两种交换机配置模式,以配置基于端口划分的VLAN为例

关于交换机的配置模式,大体上可以分为两类:其一以CISCO交换机为代表的配置模式,其二以Huawei.H3C交换机为代表的配置模式.其实这两种配置模式并没有本质的不同,只是配置的命令名称和配置方式存在差别.如果把握了交换机的配置的基本原理,就不难掌握,且举一反三可以推及其他品牌的交换机的配置.总结来说,如果以在交换机上配置VLAN为例,可以参考以下基本原理或步骤: 交换机最初通过交换机上管理口进行连接.管理口有各种形式,在交换机上是COM口(另一端也是COM口),在交换机上是RJ45接口(另一端