JS 封装

JS封装技巧详解

一、面向对象思想

    封装 继承  多态 封装思想 属性隐藏

二、封装 

<script>

//第一种封装(通过定义一个变量(cop),返回一个对象来公开(return {}))
   var cop=(function my(){
        var a=1;
        function foo() {
            console.log("函数的执行")
        }
        console.log("2"+a);
        return  {test:foo};//把函数foo重命名为test,放在一个对象里面,并返回

    })();//在函数后面加个括号就是函数自执行(隐士执行);外界无法调用my这个函数
//    console.log(a);//这里打印报错a is not defined.这就是把这个函数做了个隐藏
    cop.test();//现在就可以执行foo这个函数了
    console.log(cop);//打印出来这个cop是一个对象

//第二种封装(通过window对象来公开;但是这种方法仅限于浏览器)
    (function () {
           var b=3;
           var a=100;
           function foo2(){
              console.log("函数自执行第二种")
           }
           console.log(b);//3
        var publicObj={foo:foo2,number:b};
//        window.aa=publicObj;
        window.$=publicObj;//这里的$不是JQ,是自定义的东西,相当于上一句代码中的aa.Object{number:1}
    })();
    console.log(window.$);
    $.foo();
</script>

  因为JS没有私有化的概念,所以需要使用封装来实现隐藏,函数的呃自执行就是一个隐藏的方式方法。

属性公开的方法从上面的代码可以看出有两种,第一种是通过定义一个变量来公开。

 

转载于:https://www.cnblogs.com/potato-lee/p/6559010.html

<think>好的,我需要回答用户关于JavaScript封装方法及最佳实践的问题。用户提到他们参考了站内的两篇引用,其中一篇关于JavaScript最佳实践,另一篇关于Vue和Axios的封装。我需要结合这些信息,同时遵循系统级的指令,比如正确使用LaTeX格式,生成相关问题,并添加引用标识。 首先,我需要明确用户的问题:如何在JavaScript中进行封装,以及相关的最佳实践。封装是面向对象编程的重要概念,但在JavaScript中,由于它的原型继承和灵活的函数作用域,封装的方法可能和其他语言有所不同。我应该从基本的封装方法入手,比如使用构造函数、ES6类、闭包等,然后结合最佳实践,比如模块化、私有成员、单一职责原则等。 接下来,我需要确保回答结构清晰,分点说明。可能需要分为几个部分:封装的基本方法、最佳实践、示例代码,以及相关问题。同时,需要引用用户提供的参考内容。例如,引用[1]提到使用严格模式,这应该在最佳实践中提到。引用[2]讨论了API分组和模块化,这可以应用在模块化封装的部分。 关于LaTeX的使用,用户要求行内数学表达式用$...$,独立公式用$$...$$。不过,这个回答可能不需要数学公式,但如果有变量或代码中的数学符号,比如参数传递,可能需要用LaTeX。不过可能这里大部分是代码示例,所以需要确保代码块正确使用三个反引号,并标注语言类型。 生成相关问题部分,需要围绕封装方法和最佳实践提出相关问题,比如封装的好处、如何实现私有变量、模块化封装的优势等。 现在需要检查是否有遗漏的点,比如是否涵盖了不同的封装方法,是否结合了最佳实践,是否引用了提供的参考资料,语法是否正确,以及是否符合用户的结构要求。可能还需要注意术语的准确性,比如闭包的作用、ES6类的特性等。 最后,确保回答使用中文,引用标识自然添加在相关段落末尾,比如在提到严格模式时添加[^1],在模块化部分添加[^2]。同时,生成的三个相关问题要具体,能够引导用户进一步探索。</think>在JavaScript中,封装是提升代码可维护性和复用性的核心实践。以下是具体方法与最佳实践: ### 一、封装的基本方法 1. **构造函数封装** 通过构造函数定义对象模板,隐藏实现细节: ```javascript function User(name) { let _age = 0; // 私有变量 this.name = name; this.setAge = (age) => { _age = age }; this.getAge = () => _age; } ``` 2. **ES6类封装** 使用`class`语法与私有字段(ES2022特性): ```javascript class User { #age; // 私有属性 constructor(name) { this.name = name; } setAge(age) { this.#age = age } } ``` 3. **闭包封装** 利用函数作用域保护变量: ```javascript const counter = (() => { let count = 0; return { increment: () => count++ }; })(); ``` ### 二、最佳实践 1. **严格模式** 文件首部添加`'use strict'`强制规范编码行为,避免意外错误。 2. **模块化封装** 按功能拆分模块(如用户模块、订单模块),通过`import/export`管理: ```javascript // userAPI.js import request from './request'; export const getUser = (id) => request(`/users/${id}`); ``` 3. **接口分层** 参考API分组实践,业务逻辑层与数据访问层分离[^2]: ```javascript // api/user.js import http from './httpClient'; export default { login: (credential) => http.post('/auth/login', credential) }; ``` 4. **单一职责原则** 每个函数/类仅承担一个明确职责,如: ```javascript // 数据格式化单独封装 const formatDate = (timestamp) => new Date(timestamp).toISOString(); ``` ### 三、进阶技巧 1. **组合式封装** 通过对象组合替代继承: ```javascript const Logger = { log: (msg) => console.log(msg) }; const Service = Object.assign({ fetchData() {} }, Logger); ``` 2. **防御性编程** 参数校验与异常处理: ```javascript const safeDivide = (a, b) => { if (b === 0) throw new Error('除数不能为零'); return a / b; } ``` ```javascript // 完整封装示例 'use strict'; class DataService { #baseUrl; constructor(baseUrl) { this.#baseUrl = baseUrl; } async fetch(endpoint) { const response = await fetch(`${this.#baseUrl}/${endpoint}`); if (!response.ok) throw new Error('请求失败'); return response.json(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值