惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

云风的 BLOG
云风的 BLOG
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
J
Java Code Geeks
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Engineering at Meta
Engineering at Meta
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
小众软件
小众软件
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
月光博客
月光博客
Last Week in AI
Last Week in AI
博客园_首页
I
InfoQ
T
Tailwind CSS Blog
爱范儿
爱范儿
雷峰网
雷峰网
Recent Announcements
Recent Announcements
F
Fortinet All Blogs
B
Blog
WordPress大学
WordPress大学
A
About on SuperTechFans
V
Visual Studio Blog
有赞技术团队
有赞技术团队
P
Proofpoint News Feed

博客园 - 滋心

为hover事件加上延迟 面向对象的JavaScript(2)闭包 JQuery画细线表格 自定义控件验证页面所有文本框 - 滋心 - 博客园 LinQ in Action 笔记三:Hello LINQ to SQL LinQ in Action 笔记二:Hello LINQ to XML LinQ in Action 笔记一、Hello LINQ to Objects JQuery选择器插件 Extra selectors JQuery选择器 - 滋心 - 博客园 利用Repeater控件显示主-从关系数据表 查询表结构 Sqlserver建立和另外数据库的连接 XPath实例教程十九、ancestor-or-self 轴(axis)包含上下文节点本身和该节点的祖先节点 XPath实例教程十八、descendant-or-self 轴 XPath实例教程十七、preceding轴 XPath实例教程十六、following轴 XPath实例教程十五、preceding-sibling 轴 XPath实例教程十四、following-sibling轴 XPath实例教程十三、ancestor轴
面向对象的JavaScript(1):创建简单的类
滋心 · 2009-08-27 · via 博客园 - 滋心

我们以Book类为例,Book类有三个属性:书号、标题、作者

Code

这样一个简单的Book类就创建好了

我们可以这样实例化这个类

var book = new Book(111,"基本型","zixinhmc");
book.display();

上面的类有一个问题,我们在实例化时,并没有对ISBN 属性进行数据完整性验证,我们修改一下上面的那个类

var Book = function(isbn,title,author){
    
if(!this.checkIsbn(isbn)){
        
throw new Error("isbn错误");
    }
    
this.isbn = isbn;
    
this.title = title;
    
this.author = author;
}
Book.prototype 
= {
    checkIsbn:
function(isbn){
        
if(isbn == undefined || typeof isbn != "string"){
            
return false;
        }
        
if(isbn.length != 10){
            
return false;
        }
        
return true;
    }
    , display:
function(){
        alert(
"isbn:" + this.isbn + "\n" + "title:" + this.title + "\n" + "author:" + this.author);
    }
}

现在情况看起来有所改善了,我们在实例化对象时对ISBN属性进行有效性检查,如果不通过将抛出一个异常。
但是,现在又出现一个问题了
我们看

var book = new Book("1234567890","基本型","zixinhmc");
book.isbn 
= 1;
book.display();

我们现在可以在实例化了以后,给对象的isbn属性赋值,而这时的赋值将不会进行有效性验证,所以我们将再次修改这个类,给这三个属性添加get、set方法,让用户不能直接操作这个类的属性

var Book = function(isbn,title,author){
    
this.setIsbn(isbn);
    
this.setTitle(title);
    
this.setAuthor(author);
}
Book.prototype 
={
    checkIsbn: 
function(isbn){
        
if(isbn == undefined || typeof isbn != "string"){
            
return false;
        }
        
if(isbn.length != 10){
            
return false;
        }
        
return true;
    }
    , getIsbn: 
function(){
        
return this._isbn;
    }
    , setIsbn: 
function(isbn){
        
if(!this.checkIsbn(isbn)){
            
throw new error("isbn错误");
        }
        
this._isbn = isbn;
    }
    , getTitle: 
function(){
        
return this._title;
    }
    , setTitle: 
function(title){
        
this._title = title;
    }
    , getAuthor: 
function(){
        
return this._author;
    }
    , setAuthor: 
function(author){
        
this._author = author;
    }
    , display:
function(){
        alert(
"isbn:" + this.isbn + "\n" + "title:" + this.title + "\n" + "author:" + this.author);
    }
};

我们现在可以使用setIsbn()来给属性赋值了

var book = new Book("1234567890","门户打开型","zixinhmc");
book.setIsbn(
"0123456789");
book.display();

注意:其实,实例化后还是可以通过book._isbn来绕过检查给属性赋值的,不过,我们一般在团队内部约定以下划线(_)为前缀的属性或方法为私有,不要直接赋值或调用
我们将在下一次讲解如何创建真正拥有私有属性或方法的类

参考书目:
《JavaScript权威指南》
《JavaScritp高级程序设计》
《JavaScript设计模式》