资讯专栏INFORMATION COLUMN

JavaScript面向对象编程-封装

taoszu / 3183人阅读

摘要:前言面向对象编程是将需求抽象成一个对象,针对对象分析其特征属性和动作方法。面向对象编程思想其中一个特点就是封装,就是把需要的功能放在一个对象里。将闭包作为创建对象的构造函数。

前言

面向对象编程是将需求抽象成一个对象,针对对象分析其特征(属性)和动作(方法)。这个对象我们称之为类。面向对象编程思想其中一个特点就是封装,就是把需要的功能放在一个对象里。但是JavaScript这种解释性的弱类型语言没有经典强类型语言中通过关键字class来实现类的封装,JavaScript都是通过一些特性模仿实现的,这也让JavaScript有更高的灵活性。

封装

为类添加属性和方法的两种方式

在函数(类)的内部通过this添加属性和方法

//创建类,通过this实现对类添加属性和方法
var Book = function (id, bookname, price) {
    this.id = id;
    this.bookname = bookname;
    this.price = price;
}

通过在类的原型上添加属性和方法

1)为原型对象属性赋值

Book.prototype.display = function () {
}

2)将一个对象赋值给类的原型对象

Book.prototype = {
    display :function () {
    }
}

这样就将需要的方法和属性封装在抽象的Book类中,当使用功能方法时,不能直接使用Book类,而需要new关键字来实例化(创建)新的对象。
注意:通过this添加的属性和方法是在当前对象上添加的,而通过JavaScript是一种基于原型prototype的语言,所以每创建一个对象时,都有一个原型prototype用于指向其继承的属性、方法。这样通过prototype继承的方法并不是对象自身的。所以每次通过类创建一个新对象时,this指向的属性和方法都会得到相应的创建,但是通过prototype继承的属性和方法是每个对象通过prototype访问到,这些属性和方法不会再次创建。

通过this创建的属性是公有属性,通过this创建的方法是特权方法,在创建对象时调用特权方法可以看做是类的构造器。通过new关键字创建新对象时,由于类外面通过点语法添加的属性和方法没有执行到,所以新创建的对象中无法获取到,而prototype创建的属性或方法可以访问到,所以prototype对象中的属性和方法称为共有属性和方法。
如下:

var Book = function (id, name, price) {
}
Book.isChinese = true;
Book.prototype = {
isJsBook : false,
display :function () {}
}
var b = new Book(11,"ava", 30);
console.log(b.isJsBook);  //false
console.log(b.id);  // 11
console.log(b.idChinese); //undefined
console.log(Book.isChinese);// true
闭包实现

闭包是有权访问另一个函数作用域中变量的函数,即在一个函数内部创建另一个函数。将闭包作为创建对象的构造函数。

//利用闭包实现
var Book =(function () {
    var bookNum = 0;
    function checkBook(name) {}
    function book(newId,newName,newPrice) {
        var name,price;
        function checkId() {}
        this.getName = function(){};
        this.getPrice = function () {};
        this.setName = function () {};
        this.setPrice = function () {};
        this.id = newId;
        this.copy = function () {};
        bookNum++
        if(bookNum>100){
            throw new Error("100本书");
        }
        this.setName(name);
        this.setName(price);
    }
    _book.prototype = {
        isJsBook :false,
        display:function () {}
    };
    return _book;
})();

由于在创建对象上这种写法容易忘记使用new而犯错误,所以可以使用安全模式创建对象,也就是在创建对象过程中用instanceof判断this是否是当前这个对象。

if(this instanceof Book){
...
}else{
    return new Book()
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/97838.html

相关文章

  • SegmentFault 技术周刊 Vol.32 - 七夕将至,你的“对象”还好吗?

    摘要:很多情况下,通常一个人类,即创建了一个具体的对象。对象就是数据,对象本身不包含方法。类是相似对象的描述,称为类的定义,是该类对象的蓝图或原型。在中,对象通过对类的实体化形成的对象。一类的对象抽取出来。注意中,对象一定是通过类的实例化来的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 马上就要到七夕了,离年底老妈老爸...

    李昌杰 评论0 收藏0
  • SegmentFault 技术周刊 Vol.32 - 七夕将至,你的“对象”还好吗?

    摘要:很多情况下,通常一个人类,即创建了一个具体的对象。对象就是数据,对象本身不包含方法。类是相似对象的描述,称为类的定义,是该类对象的蓝图或原型。在中,对象通过对类的实体化形成的对象。一类的对象抽取出来。注意中,对象一定是通过类的实例化来的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 马上就要到七夕了,离年底老妈老爸...

    Lyux 评论0 收藏0
  • SegmentFault 技术周刊 Vol.32 - 七夕将至,你的“对象”还好吗?

    摘要:很多情况下,通常一个人类,即创建了一个具体的对象。对象就是数据,对象本身不包含方法。类是相似对象的描述,称为类的定义,是该类对象的蓝图或原型。在中,对象通过对类的实体化形成的对象。一类的对象抽取出来。注意中,对象一定是通过类的实例化来的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 马上就要到七夕了,离年底老妈老爸...

    AaronYuan 评论0 收藏0
  • JavaScript设计模式与开发实践 | 01 - 面向对象JavaScript

    摘要:在中,并没有对抽象类和接口的支持。例如,当对象需要对象的能力时,可以有选择地把对象的构造器的原型指向对象,从而达到继承的效果。本节内容为设计模式与开发实践第一章笔记。 动态类型语言 编程语言按数据类型大体可以分为两类:静态类型语言与动态类型语言。 静态类型语言在编译时已确定变量类型,动态类型语言的变量类型要到程序运行时,待变量被赋值后,才具有某种类型。 而JavaScript是一门典型...

    suxier 评论0 收藏0
  • JavaScript面向对象编程——面向对象

    摘要:面向对象面向对象的概述面向对象是什么面向对象编程的全称是,简称。面向对象编程是用抽象方式创建基于现实世界模型的一种编程。面向对象编程可以看做是使用一系列对象相互协作的软件设计。面向对象编程的山歌主要的特征是封装继承多态。 面向对象 面向对象的概述 面向对象是什么 面向对象编程的全称是Object Oriented Programming,简称OOP。面向对象编程是用抽象方式创建基于现实...

    SimonMa 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<