整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

JavaScript面向对象:ES6 中的类和对象

向对象


面向对象更贴近我们的实际生活, 可以使用面向对象描述现实世界事物. 但是事物分为具体的事物和抽象的事物


手机 抽象的(泛指的)


具体的(特指的)


面向对象的思维特点:


1.抽取(抽象)对象共用的属性和行为组织(封装)成一个类(模板)


2.对类进行实例化, 获取类的对象


面向对象编程我们考虑的是有哪些对象,按照面向对象的思维特点,不断的创建对象,使用对象,指挥对象做事情.


对象


现实生活中:万物皆对象,对象是一个具体的事物,看得见摸得着的实物。例如,一本书、一辆汽车、一个人可以是“对象”,一个数据库、一张网页、一个与远程服务器的连接也可以是“对象”。


在 JavaScript 中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象,例如字符串、数值、数组、函数等。


对象是由属性和方法组成的:


属性:事物的特征,在对象中用属性来表示(常用名词)


方法:事物的行为,在对象中用方法来表示(常用动词)


类 class


在 ES6 中新增加了类的概念,可以使用 class 关键字声明一个类,之后以这个类来实例化对象。


类抽象了对象的公共部分,它泛指某一大类(class)


对象特指某一个,通过类实例化一个具体的对象

面向对象的思维特点:


1.抽取(抽象)对象共用的属性和行为组织(封装)成一个类(模板)


2.对类进行实例化, 获取类的对象

();

注意: 类必须使用 new 实例化对象


类 constructor 构造函数



constructor() 方法是类的构造函数(默认方法),用于传递参数,返回实例对象,通过 new 命令生成对象实例时,自动调用该方法。如果没有显示定义, 类内部会自动给我们创建一个constructor()

1-CSS 中的属性选择器是什么?举个例子。

属性选择器允许您根据属性值选择元素。属性选择器有多种类型,包括完全匹配、部分匹配、值存在和值结尾。以下是完全匹配选择器的示例:

input[type="text"] {  border: 1px solid red;}

12-如何根据父元素的类应用CSS样式?

CSS 没有直接的父选择器,但您可以使用各种技术来实现此效果,例如组合器或 :has 选择器(尚未得到广泛支持)。

13- 什么是 CSS 变量(自定义属性)以及如何使用它们?

CSS 变量,也称为自定义属性,允许您定义可在整个样式表中使用的可重用值。它们以 -- 为前缀,并且可以使用 var() 函数为其赋值。这是一个例子:

:root {  --primary-color: #007bff;}
.element {  color: var(--primary-color);}

14-如何创建和应用 CSS 动画?

CSS 动画可让您创建流畅且具有视觉吸引力的效果。它们可以使用 @keyframes 规则定义并使用动画属性应用。这是一个例子:

@keyframes slide-in {  0% {    transform: translateX(-100%);  }  100% {    transform: translateX(0);  }}
.element {  animation: slide-in 1s forwards;}

15- CSS 中的“box-sizing”属性是什么?它如何影响布局计算?

box-sizing 属性确定如何计算元素的总宽度和高度。默认设置为content-box,仅包含指定宽度和高度内的内容。

当设置为 border-box 时,宽度和高度值包括内容、填充和边框。这是一个例子:

.box {  box-sizing: border-box;  width: 200px;  padding: 10px;  border: 1px solid black;}

ECMAScript中属性分两种类型:数据属性和访问属性

1.数据属性

数据属性有四个描述其行为的特性个:[[Configurable]]、[[Enumerable]]、[[Writable]]、[[Value]]。

  • [[Congigurable]]表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,能否将数据属性改为访问属性,默认值为true
  • [[Enumerable]]表示属性是否可枚举,即使用for in 返回属性,默认值为true
  • [[Writable]]表示是否能修改属性值,默认值为true
  • [[Value]]表示包含属性的数据值,读取属性时,从这个位置读取属性,写入新的属性时将新的属性保存在这个位置,默认值是undefined
let obj={
             name:"JSindexHTML"
};

在上面的代码中,我们定义了一个对象obj,属性名为name,属性值为JSindexHTML。在这个对象的数据属性 [[Value]] 值就被设置为 JSindexHTML。对属性 name 的任何修改都会相应的改变这个对象的数据属性 [[Value]] 的值。

如果要修改数据属性的特性,我们可以使用 Object.defineProperty() 方法。这个方法接收三个参数:属性所在的对象,属性名(属性名需要加引号),描述符对象。其中描述符对象的属性必须是:configurable、enumerable、writable 和 value且为小写。

Object.defineProperty(obj,"name",{
                                                       writable:false,
                                                           value:"JSindexHTML"
                                                       })
obj.name="Jack";
console.log(obj.name);//JSindexHTML

在上面的代码中,我们将对象的数据属性 [[Writable]]修改为 false,即禁止修改对象的属性值。此时name 属性是只读的,修改name值,严格模式下会抛出错误,非严格模式忽略。所以当我们将对象obj的name属性值修改为Jack时,console.log(obj.name) 的结果是 JSindexHTML。

如果我们把[[Writable]]修改为 true:

Object.defineProperty(obj,"name",{
                                                     writable:true,
                                                          value:"JSindexHTML"
                                                       })
obj.name="Jack";
console.log(obj.name);//Jack

当我们将 writable更改为true后,更改 obj 的 name 属性值:obj.name="Jack",console.log(obj.name)的结果为修改后的 name 的属性值 Jack。

上面的规则也适用于配置属性:

Object.defineProperty(obj,"name",{
                                                     configurable:false,
                                                          value:"JSindexHTML"
                                                       })

console.log(obj.name);//Jack

在上面的代码中,我们对象的数据属性 configurable 设置为false,所以不使用 delete 删除我们的对象属性。所以console.log(obj.name)的结果为 JSindexHTML。

在调用 Object.defineProperty()方法时,如果不指定,configurable、enumerable 和 writable 特性的默认值都是 false。

2.访问属性

访问属性不包含数据值而是包含一对儿 get和 set函数,但这两个函数不是必须的。在读取访问属性时会调用getter函数,这个函数负责返回有效值;在写入访问属性时,会调用setter函数并传入新值,这个函数决定如何处理数据。访问属性有以下四个特性:

  • [[Congigurable]]表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,能否将数据属性改为访问属性,默认值为true
  • [[Enumerable]]表示属性是否可枚举,即使用for in 返回属性,默认值为true
  • [[getter]]在读取访问属性时调用的函数
  • [[setter]]在写入访问属性时调用的函数
  • 访问属性不能直接定义,必须使用Object.definedProperty()方法定义。

    let book={
                  _year:2019,
                  edition:1
                   }
    Object.defineProperty(book,"year",{
                                          get:function(){
                                            return this._year
    },
      set:function(newValue){
                       if(newValue>2019){
                         this._year=newValue;
                         this.edition+=newValue-2019;
                       }
                }
    }
      )
      book.year=2020;
    console.log(book.edition);//2

    在上面的代码中,我们定义了 book 对象,并给这个对象添加了两个属性 _year 和 edition。_year前面的下划线是一种常用几号,用于表示只能通过对象方法访问的属性。访问器属性year包含了两个属性setter 和 getter 函数,getter函数获取_year 的值,而setter函数通过计算确定正确的版本。因此当我们把year属性修改为2020的时候,_year就会变成2019,而 edition 变为 2。这是使用访问器属性常见的方式,即设置一个属性的值也会导致其他属性值发生变化。

    为了兼容旧版本的浏览器,我们可以使用两个非标准方法创建访问属性器:__defineGetter__ 和 __defineSetter__。注意,这两个方法的前后的下划线是分别是由两条组成。

    let book={
                  _year:2019,
                  edition:1
                   }
    book.defineGettet=function(){
    return this._year;
    }
    book.defineSetter=function(newValue){
     if(newValue>2019){
                         this._year=newValue;
                         this.edition+=newValue-2019;
                       }
    }
     book.year=2020;
    console.log(book.edition);//2

    在不支持Object.defineProperty()方法的浏览器中不能修改[[Confirguable]] 和 [[Enumerable]].