在私有变量和私有方法的闭包中,如何实现继承

简介: 【10月更文挑战第26天】

在JavaScript中,实现私有变量和私有方法的闭包继承有多种方式:

借助原型链继承公有方法并共享私有变量

  • 这种方式通过在父类的构造函数中定义私有变量和私有方法,并在子类的构造函数中调用父类的构造函数来继承公有方法,同时子类可以通过原型链访问父类的公有方法,从而实现对私有变量和私有方法的间接访问和继承。
function Parent() {
   
  // 私有变量
  var privateVariable = 'This is a parent private variable';

  // 私有方法
  function privateMethod() {
   
    console.log('This is a parent private method');
  }

  // 公有方法
  this.publicMethod = function() {
   
    console.log('This is a parent public method');
    console.log(privateVariable);
    privateMethod();
  };
}

function Child() {
   
  Parent.call(this);
}

Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;

var child = new Child();
child.publicMethod();
  • 在上述示例中,Child构造函数通过Parent.call(this)调用了父类的构造函数,继承了父类的公有方法publicMethod。由于publicMethod内部形成了闭包,可以访问父类的私有变量和私有方法,从而实现了对私有变量和私有方法的继承。

使用组合继承

  • 组合继承结合了原型链继承和构造函数继承的优点,既可以继承父类的原型属性和方法,又可以在子类的构造函数中定义自己的属性和方法,同时还可以通过闭包实现私有变量和私有方法的继承。
function Parent() {
   
  // 私有变量
  var privateVariable = 'This is a parent private variable';

  // 私有方法
  function privateMethod() {
   
    console.log('This is a parent private method');
  }

  // 公有方法
  this.publicMethod = function() {
   
    console.log('This is a parent public method');
    console.log(privateVariable);
    privateMethod();
  };
}

function Child() {
   
  Parent.call(this);
  // 子类的私有变量
  var childPrivateVariable = 'This is a child private variable';

  // 子类的私有方法
  function childPrivateMethod() {
   
    console.log('This is a child private method');
  }

  // 子类的公有方法,可访问子类和父类的私有变量和私有方法
  this.childPublicMethod = function() {
   
    console.log('This is a child public method');
    console.log(childPrivateVariable);
    childPrivateMethod();
    this.publicMethod();
  };
}

Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;

var child = new Child();
child.childPublicMethod();
  • 在此示例中,Child构造函数首先通过Parent.call(this)继承了父类的公有方法和私有变量、私有方法的访问权,然后在自身构造函数中定义了子类的私有变量和私有方法,并通过childPublicMethod公有方法实现了对子类和父类私有变量和私有方法的访问和调用,完成了继承。

使用寄生组合继承

  • 寄生组合继承是对组合继承的一种优化,它解决了组合继承中父类构造函数被多次调用的问题,同时也能够很好地实现私有变量和私有方法的闭包继承。
function inheritPrototype(subClass, superClass) {
   
  var prototype = Object.create(superClass.prototype);
  prototype.constructor = subClass;
  subClass.prototype = prototype;
}

function Parent() {
   
  // 私有变量
  var privateVariable = 'This is a parent private variable';

  // 私有方法
  function privateMethod() {
   
    console.log('This is a parent private method');
  }

  // 公有方法
  this.publicMethod = function() {
   
    console.log('This is a parent public method');
    console.log(privateVariable);
    privateMethod();
  };
}

function Child() {
   
  Parent.call(this);
  // 子类的私有变量
  var childPrivateVariable = 'This is a child private variable';

  // 子类的私有方法
  function childPrivateMethod() {
   
    console.log('This is a child private method');
  }

  // 子类的公有方法,可访问子类和父类的私有变量和私有方法
  this.childPublicMethod = function() {
   
    console.log('This is a child public method');
    console.log(childPrivateVariable);
    childPrivateMethod();
    this.publicMethod();
  };
}

inheritPrototype(Child, Parent);

var child = new Child();
child.childPublicMethod();
  • 在这个例子中,inheritPrototype函数用于实现寄生组合继承,它正确地设置了子类的原型链,使得子类能够继承父类的原型方法,同时Child构造函数通过Parent.call(this)继承了父类的实例属性和方法,包括对父类私有变量和私有方法的访问权,从而实现了私有变量和私有方法的闭包继承,并且避免了组合继承中父类构造函数被多次调用的问题。

通过以上几种方式,可以在JavaScript中实现私有变量和私有方法的闭包继承,开发者可以根据具体的需求和场景选择合适的继承方式来构建更复杂的面向对象结构,实现代码的复用和扩展。

相关文章
|
21天前
|
JavaScript 前端开发 开发者
创建一个私有变量和私有方法的闭包
【10月更文挑战第26天】可以在JavaScript中创建具有私有变量和私有方法的闭包,实现数据的封装和隐藏,提高代码的可维护性和安全性。不同的方式适用于不同的场景,开发者可以根据具体的需求选择合适的方法来创建闭包。
|
6月前
|
JavaScript
TypeScript【类的继承、访问修饰符、readonly 修饰符、存取器、实例方法与静态方法、实例属性与静态属性、静态属性、抽象类】(三)-全面详解(学习总结---从入门到深化)
TypeScript【类的继承、访问修饰符、readonly 修饰符、存取器、实例方法与静态方法、实例属性与静态属性、静态属性、抽象类】(三)-全面详解(学习总结---从入门到深化)
66 0
|
3月前
|
存储 Java 程序员
08 Java面向对象基础(对象与类+实例变量与方法+构造方法+this关键字)
08 Java面向对象基础(对象与类+实例变量与方法+构造方法+this关键字)
79 4
|
5月前
|
Java 数据安全/隐私保护
Java基础手册二(类和对象 对象创建和使用 面向对象封装性 构造方法与参数传递 this关键字 static关键字 继承 多态 方法覆盖 final关键字 访问控制权限修饰符)
Java基础手册二(类和对象 对象创建和使用 面向对象封装性 构造方法与参数传递 this关键字 static关键字 继承 多态 方法覆盖 final关键字 访问控制权限修饰符)
35 0
|
6月前
|
存储 编译器 程序员
【C++】类和对象①(什么是面向对象 | 类的定义 | 类的访问限定符及封装 | 类的作用域和实例化 | 类对象的存储方式 | this指针)
【C++】类和对象①(什么是面向对象 | 类的定义 | 类的访问限定符及封装 | 类的作用域和实例化 | 类对象的存储方式 | this指针)
|
6月前
|
存储 C语言 C++
【c++】类和对象 - 类的访问限定符及封装/作用域和实例化
【c++】类和对象 - 类的访问限定符及封装/作用域和实例化
【c++】类和对象 - 类的访问限定符及封装/作用域和实例化
|
自然语言处理 Java
7.2 深入理解闭包与内部类:内部类如何实现闭包
7.2 深入理解闭包与内部类:内部类如何实现闭包
126 0
|
存储 设计模式 安全
如何理解子类对象赋值给父类(深入理解动态绑定、静态绑定)
如何理解子类对象赋值给父类(深入理解动态绑定、静态绑定)
如何理解子类对象赋值给父类(深入理解动态绑定、静态绑定)
|
存储 编译器 程序员
【C++要笑着学】类和对象 | 初识封装 | 访问限定符 | 类的作用域和实例化 | 类对象模型 | this指针(二)
本章将正式开始学习C++中的面向对象,本篇博客涵盖讲解 访问限定符、封装的基础知识、类的作用域和实例化、探究类对象的存储和对于this指针由浅入深地讲解。
166 0
【C++要笑着学】类和对象 | 初识封装 | 访问限定符 | 类的作用域和实例化 | 类对象模型 | this指针(二)
|
存储 Java 编译器
【C++要笑着学】类和对象 | 初识封装 | 访问限定符 | 类的作用域和实例化 | 类对象模型 | this指针(一)
本章将正式开始学习C++中的面向对象,本篇博客涵盖讲解 访问限定符、封装的基础知识、类的作用域和实例化、探究类对象的存储和对于this指针由浅入深地讲解。
156 0
【C++要笑着学】类和对象 | 初识封装 | 访问限定符 | 类的作用域和实例化 | 类对象模型 | this指针(一)
下一篇
无影云桌面