JS模拟私有属性和方法

模拟私有属性和方法

概述

我们知道,在JS中,是没有明确定义私有属性或私有方法的语法的,通常约定在属性和方法前加下划线来告知开发者这是一个私有的属性或变量,如果需要创造出私有属性、方法,则需要一些小技巧。 在JS中,分为全局作用域和函数作用域,在函数内定义的属性和方法,都只能在当前函数内被访问到,在外部不能被访问,所以简单来说,在函数内部定义的属性和方法,都可以成为私有的。 当然,我们还可以提供一些公有的属性、方法(或者叫特权方法)去访问私有的属性和方法,但是常规来讲,既然属性、方法已经被私有,怎么还能让他被公有方法所访问?答案是:闭包。 闭包的定义在此不做阐述,直接看例子。

var Animal = (
    function() {
      function Animal(age) {
        this.age = age;
      }
      /*
        这里有两个私有属性和一个私有方法,分别用下划线做标识。
      */
      _climb = true;
      _name = '动物';
      function _canClimb() {
        if (_climb) {
          console.log(_name + '会爬树');
        } else {
          console.log(_name + '不会爬树');
        }
      }

      Animal.prototype.eat = function() {
        console.log('吃饭');
      };
      /*
        在函数的原型上,访问私有方法或属性。
        这里可以访问是因为在这个匿名函数的作用域内定义的方法是可以访问到当前函数作用域内的所有属性和方法的。
        通过设置set get函数,来访问这些私有属性、方法。如果不提供set get函数,则私有属性、方法就不会被外部所访问到。
      */  
      Animal.prototype.isCanClimb = function() {
        _canClimb();
      };

      Animal.prototype.setClimb = function(value) {
        _climb = value;
      };

      Animal.prototype.getClimb = function() {
        console.log(_climb);
      };

      Animal.prototype.setName = function(value) {
        _name = value;
      };
      Animal.prototype.getName = function() {
        console.log(_name);
      };
      return Animal;
    }
)();

var cat = new Animal(24);
cat.isCanClimb(); // 动物会爬树
cat.setName('猫咪');
cat.isCanClimb(); // 猫咪会爬树
cat.setClimb(false);
cat.isCanClimb(); // 猫咪不会爬树

/* 上面的例子是通过构造函数的方式创建 下面的例子是普通对象创建私有属性、方法 */

var transformers = (
    function() {
    /*
        私有方法和属性,外部不能直接访问
        可以通过setget函数访问
    */
      var _hideSkill = '变身';
      function _transform() {
        console.log('开始'+ _hideSkill);
      }

      return {
        name: '变形金刚',
        fly: function() {
          console.log('开始飞');
        },
        transform: function() {
          _transform();
        },
        setHideSkill: function(value) {
          _hideSkill = value;
        },
        getHideSkill: function() {
          return _hideSkill;
        }

      }
    }
)();


详情关注博客 https://mmmaming.github.io/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值