js继承,闭包和css继承

JavaScript继承

继承是一种面向对象编程的重要概念,JavaScript中可以通过原型链实现继承。闭包是一种特殊的函数,它可以访问其外部函数作用域中的变量。

下面是一个使用原型链实现继承的示例代码:

javascript 复制代码
// 父类
function Animal(name) {
  this.name = name;
}

Animal.prototype.sayHello = function() {
  console.log("Hello, I'm " + this.name);
}

// 子类
function Dog(name, breed) {
  Animal.call(this, name); // 调用父类构造函数
  this.breed = breed;
}

Dog.prototype = Object.create(Animal.prototype); // 设置子类的原型为父类的实例
Dog.prototype.constructor = Dog; // 修复子类的构造函数

Dog.prototype.bark = function() {
  console.log("Woof, I'm a " + this.breed + " named " + this.name);
}

// 使用示例
var dog = new Dog("Buddy", "Labrador");
dog.sayHello(); // 输出:Hello, I'm Buddy
dog.bark(); // 输出:Woof, I'm a Labrador named Buddy

在上面的代码中,Animal是一个父类,Dog是一个子类。通过调用Animal.call(this, name)来在子类的构造函数中调用父类的构造函数,以继承父类的属性。然后,通过Object.create(Animal.prototype)将子类的原型设置为父类的实例,以继承父类的方法。最后,修复子类的构造函数,使其指向正确的构造函数。

CSS继承:

在CSS中,继承是指子元素可以继承父元素的某些属性值。一些常见的可继承属性包括font-familyfont-sizecolor等。

下面是一个使用CSS继承的示例代码:

html 复制代码
<!DOCTYPE html>
<html>
<head>
  <style>
    .parent {
      font-family: Arial, sans-serif;
      font-size: 16px;
      color: blue;
    }

    .child {
      /* 子元素继承父元素的字体和颜色 */
      font-family: inherit;
      color: inherit;
      /* 子元素自定义字体大小 */
      font-size: 20px;
    }
  </style>
</head>
<body>
  <div class="parent">
    <p class="child">This is a child element.</p>
  </div>
</body>
</html>

在上面的代码中,.parent类定义了一些字体和颜色的样式,.child类继承了.parent类的字体和颜色属性,同时自定义了字体大小。这样,子元素<p>继承了父元素<div>的字体和颜色,但使用了自己的字体大小。

需要注意的是,并非所有的CSS属性都可继承,只有特定的属性才支持继承。可以查阅CSS规范以了解哪些属性是可继承的。

CSS继承的多个场景

当我们谈论CSS继承时,我们通常是指子元素继承父元素的某些属性值。下面是一些常见的CSS属性,它们可以被子元素继承:

  1. font-family:子元素继承父元素的字体系列。
css 复制代码
.parent {
  font-family: Arial, sans-serif;
}

.child {
  /* 子元素继承父元素的字体系列 */
  font-family: inherit;
}
  1. font-size:子元素继承父元素的字体大小。
css 复制代码
.parent {
  font-size: 16px;
}

.child {
  /* 子元素继承父元素的字体大小 */
  font-size: inherit;
}
  1. color:子元素继承父元素的文本颜色。
css 复制代码
.parent {
  color: blue;
}

.child {
  /* 子元素继承父元素的文本颜色 */
  color: inherit;
}
  1. line-height:子元素继承父元素的行高。
css 复制代码
.parent {
  line-height: 1.5;
}

.child {
  /* 子元素继承父元素的行高 */
  line-height: inherit;
}
  1. text-align:子元素继承父元素的文本对齐方式。
css 复制代码
.parent {
  text-align: center;
}

.child {
  /* 子元素继承父元素的文本对齐方式 */
  text-align: inherit;
}

需要注意的是,并非所有的CSS属性都可继承,只有特定的属性才支持继承。可以查阅CSS规范以了解哪些属性是可继承的。

闭包说明

当我们在一个函数内部定义另一个函数时,内部函数可以访问外部函数的变量和参数,即使外部函数已经执行完毕。这种函数和其相关变量的组合被称为闭包。

下面是一个使用闭包的示例代码:

javascript 复制代码
function outerFunction() {
  var outerVariable = 'I am from outer function';

  function innerFunction() {
    console.log(outerVariable);
  }

  return innerFunction;
}

var closure = outerFunction();
closure(); // 输出:I am from outer function

在上面的代码中,outerFunction是外部函数,它定义了一个变量outerVariable和一个内部函数innerFunction。内部函数innerFunction可以访问外部函数的变量outerVariable,即使外部函数已经执行完毕。通过调用outerFunction(),我们将内部函数innerFunction作为闭包返回,并将其赋值给变量closure。然后,我们可以通过closure()调用闭包函数,从而访问外部函数的变量。

闭包的一个重要应用是创建私有变量。通过在外部函数中定义变量,然后在内部函数中进行操作和访问,我们可以实现对变量的封装和保护,避免外部的直接访问和修改。

javascript 复制代码
function counter() {
  var count = 0;

  function increment() {
    count++;
    console.log(count);
  }

  function decrement() {
    count--;
    console.log(count);
  }

  return {
    increment: increment,
    decrement: decrement
  };
}

var counterObj = counter();
counterObj.increment(); // 输出:1
counterObj.increment(); // 输出:2
counterObj.decrement(); // 输出:1

在上面的代码中,我们使用闭包创建了一个计数器对象。counter函数返回一个包含两个方法incrementdecrement的对象。这两个方法可以访问和修改外部函数中的私有变量count。通过调用counter(),我们得到一个计数器对象counterObj,然后可以通过counterObj.increment()counterObj.decrement()来增加和减少计数器的值。由于私有变量count只能通过内部函数访问,外部无法直接修改它,从而实现了对变量的保护。

相关推荐
前端康师傅9 分钟前
JavaScript 中你不知道的按位运算
前端·javascript
小桥风满袖12 分钟前
Three.js-硬要自学系列38之专项学习缓冲几何体
前端·css·three.js
tianchang28 分钟前
策略模式(Strategy Pattern)深入解析与实战应用
前端·javascript·代码规范
best66630 分钟前
JavaScript的Math内置对象,到底是何方神圣?
javascript
掘金安东尼36 分钟前
技术解析:高级 Excel 财务报表解析器的架构与实现
前端·javascript·面试
Hilaku37 分钟前
深入CSS层叠的本质:@layer如何优雅地解决样式覆盖与!important滥用问题
前端·css·html
每天开心43 分钟前
一文教你掌握事件机制
前端·javascript·ai编程
LeeAt1 小时前
真的!真的就一句话就能明白this指向问题
前端·javascript
jyan_敬言1 小时前
【C++】string类(二)相关接口介绍及其使用
android·开发语言·c++·青少年编程·visual studio
慕y2741 小时前
Java学习第十六部分——JUnit框架
java·开发语言·学习