返回

掌握 JavaScript 继承的艺术:深入了解私有和公有属性

前端

在 JavaScript 中,继承的概念至关重要,它使我们能够创建可重用的代码和建立对象层次结构。然而,理解继承机制中私有和公有属性之间的区别对于构建健壮且可维护的应用程序至关重要。

私有与公有:界定 JavaScript 继承

JavaScript 中的继承并非像传统面向对象语言(如 Java 或 C++)中那样严格。这主要是因为 JavaScript 采用原型继承模型,其中对象从其原型继承属性和方法。

私有属性和方法: 这些元素仅对对象本身可见,无法从其子对象访问。在构造函数中定义的属性和方法通常被视为私有属性。

公有属性和方法: 这些元素对对象本身及其所有子对象都可见。这些元素通常定义在对象的原型上。

通过原型链访问属性和方法

当子对象尝试访问父对象的属性或方法时,JavaScript 会沿原型链向上查找。如果属性或方法在子对象的原型中未找到,则会在其父对象的原型中查找,依此类推。

通过原型链访问属性和方法的示例:

const Person = function (name) {
  this.name = name; // 私有属性
};

Person.prototype.greet = function () {
  console.log(`Hello, my name is ${this.name}.`); // 公有方法
};

const Employee = function (name, title) {
  Person.call(this, name); // 调用父构造函数
  this.title = title; // 私有属性
};

Employee.prototype = Object.create(Person.prototype); // 设置原型继承
Employee.prototype.work = function () {
  console.log(`${this.name} is working as a ${this.title}.`); // 公有方法
};

const john = new Employee('John', 'Engineer');
john.greet(); // 输出:Hello, my name is John.
john.work(); // 输出:John is working as a Engineer.

在这个例子中,Person 对象的 name 属性是私有的,只能由 Person 对象访问。greet 方法是公有的,可以由 Person 对象及其子对象访问。Employee 对象的 title 属性是私有的,work 方法是公有的。

控制访问:使用闭包实现真正的私有性

虽然通过构造函数和原型可以实现私有属性和方法的概念,但它们并不是真正意义上的私有。这主要是由于 JavaScript 中缺少访问控制修饰符(如 privateprotected)。

为了实现真正的私有性,我们可以利用闭包。闭包是一种在 JavaScript 中创建私有作用域的技术。通过将函数包裹在另一个函数中,我们可以控制对内部变量的访问。

实现真正私有属性和方法的闭包示例:

const Person = function (name) {
  const privateName = name; // 真正的私有属性

  this.getName = function () {
    return privateName; // 公有方法,用于访问私有属性
  };
};

const john = new Person('John');
console.log(john.getName()); // 输出:John
console.log(john.privateName); // 无法访问,因为它是真正的私有属性

结论

理解 JavaScript 继承中的私有和公有属性对于构建健壮且可维护的应用程序至关重要。通过原型链和闭包,我们可以控制对属性和方法的访问,从而在保持代码可重用的同时保护数据的完整性。牢牢掌握这些概念将使你能够创建更加强大和安全的 JavaScript 应用程序。