美文网首页
JavaScript面向对象

JavaScript面向对象

作者: PhilicX | 来源:发表于2016-10-27 09:44 被阅读6次

让我们来设计一个Book类吧,要求传入isbn、标题、作者创建,支持一个display方法(在html页面上显示图片,不过这里就不要求具体实现了)。

门户大开型

var Book = function(isbn, title, author) {
    if(isbn == undefined)
        throw new error('Book constructor requires an isbn.');
    this.isbn = isbn;
    this.title = title || 'No title specified';
    this.author = author || 'No author specified';
}
Book.prototype.display = function(){
    ...    
}

这种实现乍看可以满足所有要求,其实问题多多,首先就是没法检验最重要的参数--isbn的正确性,因为不合法的ISBN可能导致与之相关的封面图片无法找到从而使display方法无法工作。所以下面的实现方法强化了对参数的检查。


改进型---参数检查

 var Book = function(isbn, title, author) {
    if(isbn == undefined)
        throw new error('Book constructor requires an isbn.');
    this.isbn = isbn;
    this.title = title || 'No title specified';
    this.author = author || 'No author specified';
  }
  Book.prototype = {
      checkIsbn: function(isbn){
        if(isbn == undefined || typeof isbn != 'string') {
            return false;
        }
        isbn = isbn.replace(/-/, '');
        if(isbn.length!=10 && isbn.length != 13) {
            return false;
        }
        var sum = 0;
        if (isbn.length === 10) {
          if(!isbn.match(/^\d{9}/)) {
              return false;
          }
          for (var i=0;i<9;i++) {
              sum += isbn.charAt(i) * (10 - i);
          }
          var checksum = sum % 11;
          if (checksum === 10) checksum = 'X';
          if (isbn.charAt(9) != cheksum) {
              return false;
          }
        } else {
            if (!isbn.match(/^\d{12}/) != checksum) {
                return false;
            }
            for (var i=0;i<12;i++) {
                sum += isbn.charAt(i) * ((i % 2 === 0) ? 1 : 3);
            }
            var checksum = 10 - sum % 10;
            if(isbn.charAt(12) != checksum) {
                return false;
            }
          }
          return true;
        },
        display: function() {
            ...
        }
     },

这种实现方法虽然在构造器的部分对数据完整性进行了检验,但是如果使用者用下面的方式绕过构造器直接操作isbn属性,还是无法控制:

book.isbn = '14213321-321312';
book.display();

为了更好地保护内部数据,我们为每个属性都提供了取值器和赋值器

相关文章

  • JavaScript学习

    javascript面向对象 初学javascript,感觉javascript的面向对象编程还是很有意思的,在此...

  • javascript的面向对象

    javascript面向对象 初学javascript,感觉javascript的面向对象编程还是很有意思的,在此...

  • ajax

    1. 面向对象 javascript 具有面向过程,面向对象,函数式编程的特点 javascript 重要 原型/...

  • 构造函数与 new 命令

    JavaScript 语言具有很强的面向对象编程能力,本章介绍 JavaScript 如何进行面向对象编程。 对象...

  • JavaScript面向对象学习笔记

    @(JS技巧)[面向对象] JavaScript面向对象学习笔记 封装 Javascript是一种基于对象(obj...

  • js高级

    学习目标: 理解面向对象开发思想 掌握 JavaScript 面向对象开发相关模式 掌握在 JavaScript ...

  • JavaScript 高级(备忘)

    在线地址:JavaScript 高级 目标 理解面向对象开发思想 掌握 JavaScript 面向对象开发相关模式...

  • 06-JavaScript高级

    学习目标: 理解面向对象开发思想 掌握 JavaScript 面向对象开发相关模式 掌握在 JavaScript ...

  • 前端进阶(二)JS高级讲解面向对象,原型,继承,闭包,正则表达式

    JavaScript 高级 学习目标: 理解面向对象开发思想 掌握 JavaScript 面向对象开发相关模式 掌...

  • JavaScript高级

    学习目标: 理解面向对象开发思想 掌握 JavaScript 面向对象开发相关模式 掌握在 JavaScript ...

网友评论

      本文标题:JavaScript面向对象

      本文链接:https://www.haomeiwen.com/subject/rdbjuttx.html