如何在JavaScript中实现私有属性的写类方式(二)

上一篇写了个工具函数$class,这篇再完善以下。实现以下功能

1,继承

2,子类继承父类时,不继承父类的私有属性


代码如下:

/**
 * @param {String} className
 * @param {String/Function} superCls
 * @param {Function} classImp
 */
function $class(className, superCls, classImp){
    if(superCls === '') superCls = Object;
    function clazz(){
        if(typeof this.init == "function"){
            this.init.apply(this, arguments);
        }
    }
    var p = clazz.prototype = new superCls();
    var _super = superCls.prototype;
    window[className] = clazz;
    classImp.apply(p, [_super]);
}

先写个父类


代码如下:

/**
 * 父类 Person
 */
$class('Person','',function(){
    // 私有属性age
    var age;
    this.init = function(n, a){
        // 公有属性name
        this.name = n;
        // 私有属性初始化
        age = a;
    };
    this.getName = function(){
        return this.name;
    };
    this.setName = function(name){
        this.name = name;
    }
    this.getAge = function(){
        return age;
    };
    this.setAge = function(a){
        age = a;
    };
});

写子类,继承于Person


代码如下:

$class("Man",Person, function(supr){
    var school;
    this.init = function(n, a, s){
        supr.init.apply(this, [n,a]);
        school = s;
    }
    this.getSchool = function(){
        return school;
    };
    this.setSchool = function(s){
        school = s;
    };
});

new一个子类实例


代码如下:

var m = new Man('tom', 25, 'pku');
console.log(m.name); // tom 继承父类的共有属性name可以直接使用点操作符获取
console.log(m.age);  // undefined 父类的私有属性age不能直接使用点操作符获取
console.log(m.getAge()); // 25 可通过父类的共有方法getAge获取私有属性age
console.log(m.school); // undefined Man自己的私有属性仍然不能通过点操作符获取
console.log(m.getSchool()); // pku 通过getSchool()方法获取私有属性school

(0)

相关推荐

  • javascript 写类方式之一

    EMCA262规范中没有类(class)的概念,js的new只是让他看起来更像c++,java一点.这里说的写类,只是书写js代码风格而已. 1.构造函数方式 复制代码 代码如下: /** * Person类:定义一个人,有个属性name,和一个getName方法 * @param {String} name */ function Person(name) { this.name = name; this.getName = function() { return this.name; } }

  • 如何在JavaScript中实现私有属性的写类方式(二)

    上一篇写了个工具函数$class,这篇再完善以下.实现以下功能 1,继承 2,子类继承父类时,不继承父类的私有属性 复制代码 代码如下: /**  * @param {String} className  * @param {String/Function} superCls  * @param {Function} classImp  */function $class(className, superCls, classImp){     if(superCls === '') superC

  • 如何在JavaScript中实现私有属性的写类方式(一)

    之前讨论过JavaScript中的写类方式.但没有讨论私有的实现.这篇看下. 我们知道JS中私有属性的实现本质就是 var + closure.如下 复制代码 代码如下: function Person(n, a){     // public     this.name = n;     // private     var age = a;     this.getName = function(){         return this.name;     }     this.getA

  • JavaScript 中创建私有成员

    目录 1.使用闭包 2.使用 ES6 类 3.使用 ES2020 提案 4.使用 WeakMap 5.使用 TypeScript 前言: 面向对象编程语言中的 private 关键字是一个访问修饰符,可用于使属性和方法只能在声明的类中访问.这使得隐藏底层逻辑变得容易,这些底层逻辑应该被隐藏起来,并且不应该与类的外部交互. 但是如何在 JavaScript 中实现类似的功能呢? 没有保留关键字 private ,但在新的标准中 JavaScript 有自己的方法来创建类私有成员,但目前还处于 ES

  • ES6 Class中实现私有属性的一些方法总结

    私有属性 私有属性是面向对象编程(OOP)中非常常见的一个特性,一般满足以下的特点: 能被class内部的不同方法访问,但不能在类外部被访问: 子类不能继承父类的私有属性. 备胎Class 时间回到四年前,2015年6月,ES6发布成为标准,为了纪念这个历史性时刻,这个标准又被称为ES2015,至此,JavaScript中的class从备胎中转正.在这之前,class一直作为JS的关键字,雪藏不见天日. class被认为是JS的一种语法糖,它为JavaScript带来了用面向对象的思想描述一个实

  • 详解如何在Javascript中使用Object.freeze()

    Object.freeze() Object.freeze() 方法可以冻结一个对象.一个被冻结的对象再也不能被修改:冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性.可配置性.可写性,以及不能修改已有属性的值.此外,冻结一个对象后该对象的原型也不能被修改.freeze() 返回和传入的参数相同的对象 用法 const objectExample = { prop1: 20, prop2: "羊先生" }; // 默认情况下,我们可以根据需

  • 如何在JavaScript中正确处理变量

    变量无处不在.即便我们写一个小函数或一个小工具,也要声明.赋值和读取变量.增强对变量的重视,可以提高代码的可读性和可维护性. 1.建议使用 const,要么使用 let 用 const 或 let 声明自己的 JavaScript 变量.两者之间的主要区别是 const 变量在声明时需要初始化,并且一旦初始化就无法再重新赋值. // const 需要初始化 const pi = 3.14; // const 不能被重新赋值 pi = 4.89; // throws "TypeError: Ass

  • 如何在JavaScript中使用localStorage详情

    如果你是一名开发人员,想要进入到.NET的世界,你需要知道都有哪些可能.由于.NET Framework是.NET生态系统中最流行的技术,你可以用它来构建各种各样的应用程序,但是最近,出现了一些新的东西,比如 .NET Core 和.NET Standard library.我们可以在项目或构建中使用它吗? localStorage对象是web编程中应用最广泛的对象之一.它提供了在用户计算机上本地存储键值对的简单解决方案. 大多数web开发人员都喜欢localStorage API,因为它具有简

  • JavaScript 中 avalon绑定属性总结

    avalon是前端MVVM框架,将所有前端代码彻底分成两部分,视图的处理通过绑定实现(angular有个更炫酷的名词叫指令),业务逻辑则集中在一个个叫VM的对象中处理.我们只要操作VM的数据,它就自然而然地神奇地同步到视图. $model(所有非$属性),$event(事件对象) 1.作用域圈定 ms-controller:按着就近原则自下而上扫描DOM树 ms-important:仅扫描本节点及之下作为扫描区 ms-skip:使绑定失效 2.ms-duplex双向绑定属性:除了绑定(VM同步数

  • 如何在ADSI中查询用户属性?

    如何在ADSI中查询用户属性?<%Dim x On error resume next'Set x = GetObject("WinNT://kenfilszwin2k/allen")strLDAP="LDAP://kenfilszwin2k/CN=Allen He,OU=kenfilsz,dc=kenfilsz,dc=com" set x=getobject(strLDAP)Response.Write "Object Name: " &

  • 如何在JavaScript中创建具有多个空格的字符串?

    通过创建变量 var a = 'something' + '                         ' + 'something' 我得到这个值:'something something'. 如何在JavaScript中创建一个包含多个空格的字符串? 使用\xa0- 它是一个NO-BREAK SPACE char. 从UTF-8编码表和Unicode字符引用,可以写成如下: var a = 'something' + '\xa0\xa0\xa0\xa0\xa0\xa0\xa0' + '

随机推荐