返回
首页 > 生活常识

html制作网页案例代码(HTML)

时间: 2023-01-15

Web网页设计,HTML语言最全知识点总结(超级详解)图文并茂

1dc07e57a1b6ca624b44150086d807.pc_detail&x-expires=1661345681&x-signature=ueimukyy5hrxxnt3xkjnlvvjhxa%3d

HTML-JavaScript基础(非常详细)

哈喽!小伙伴们好久不见了,最近在忙些的事情更新的内容就比较少了。刚闲下来了就打算把之前断更的内容衔接上。以便爱学习的你能够及时关注,继续接下来的内容学习。好了话不多说就开始今天的内容分享吧。

之前我们讲过两篇关于web网页设计的一些相关基础知识,小伙伴们还有印象吗?要是没有的话小编这里也为大家准备了之前分享的内容链接。感兴趣的小伙伴点开链接看看,常说温故知新,才能更近一步。

以下是之前内容分享链接直接点击就可以自动跳转哦。

Web网页设计,HTML语言最全知识点总结(超级详解)图文并茂

Web前端网页设计CSS样式表语言从入门到精通(1),小白入门教程

以上就是之前分享的内容。

HTML-JavaScript基础篇:

,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。通常JavaScript脚本是通过嵌入在HTML中来实现自身的功能的。

e690a30de94cda7a51fd875b9bce8e.pc_detail&x-expires=1661345681&x-signature=wxs4y7kswp7u9rpqsvstbqwub4k%3d

是一种解释性脚本语言(代码不进行预编译)。

主要用来向HTML(标准通用标记语言下的一个应用)页面添加交互行为。

可以直接嵌入HTML页面,但写成单独的js文件有利于结构和行为的分离。

跨平台特性,在绝大多数浏览器的支持下,可以在多种平台下运行(如Windows、Linux、Mac、Android、iOS等)。

621236cf4e126473f6671b2faed2da.pc_detail&x-expires=1661345681&x-signature=vgbvwugqvuv4maandv%2bgeg8fvsi%3d

508e15eb3a9a944695cd3ed82fbb02.pc_detail&x-expires=1661345681&x-signature=z4fth1vsdydt1vepcmpge1m7zfc%3d

因此,了解以上三个内容,是我们能否学好弄通的基础哦。

动态语言

JavaScript是一门动态语言,所谓的动态语言可以暂时理解为在语言中的一切内容都是不确定的。比如一个变量,这一时刻是个整型,下一时刻可能会变成字符串了。当然这个问题我们以后再谈。不过在补充一句动态语言相比静态语言性能上要差一些,不过由于JavaScript中应用的JIT技术,所以JavaScript可能是运行速度最快的动态语言了。

类似于 C 和 Java 的语法结构

JavaScript的语法结构与C和Java很像,向for、if、while等语句和Java的基本上是一模一样的。所以有过C和Java基础的同学学习起来会轻松很多。不过JavaScript和与Java的关系也仅仅是看起来像而已。

基于原型的面向对象

JavaScript是一门面向对象的语言,

7c12a48028f74a1a4454fe935a0839.pc_detail&x-expires=1661345681&x-signature=agkxcae1pmdtoz6hqeephxemhk4%3d

标签引用

文件引用

页面输出

控制台输出

弹出窗口输出

JavaScript的注释

单行注释

多行注释

451dc61983b3123ac42054a4367dca.pc_detail&x-expires=1661345681&x-signature=lmnfq2wgnjtp0vkdosgsi%2f6she4%3d

JavaScript基础语法:标识符

所谓标识符,就是指给。

标识符可以是按照下列格式规则组合起来的一或多个字符:

第一个字符必须是一个字母、下划线( _ )或者一个美元符号( $ )。

其它字符可以是字母、下或者是是是是是是是是是是、美元符号或数字。

按照惯例,ECMAScript 标识符采用驼峰命名法。

标识符不能是关键字和保留字符。

b4b088b6681b67c95a91452ddd3823.pc_detail&x-expires=1661345681&x-signature=dalpsyocl8hlrpralw4h5onkoo4%3d

d2ac97c8e93451be88d7e90261c43a.pc_detail&x-expires=1661345681&x-signature=q2pehe19gwl3orkulenvm2xiqig%3d

5698d7ebcb368333f146b9df3d1a4a.pc_detail&x-expires=1661345681&x-signature=okabre0dh43gwbkvej9ayjpdxny%3d

字面量和变量

字面量

变量

例如:var a = 123;

数据类型

类型分类

数据类型决定了一个数据的特征,比如:123和”123”,直观上看这两个数据都是123,但实际上前者是一个数字,而后者是一个字符串。

对于不同的数据类型我们在进行操作时会有很大的不同。

JavaScript中一共有5种基本数据类型:

字符串型(String)

数值型(Number)

布尔型(Boolean)

undefined型(Undefined)

null型(Null)

这5种之外的类型都称为Object,所以总的来看JavaScript中共有六种数据类型。

typeof运算符

console.log(typeof 123);

console.log(typeof "Hello,World");

console.log(typeof true);

console.log(typeof undefined);

console.log(typeof null)

String

dc9f69a0911bbf76bd31d91541b7a5.pc_detail&x-expires=1661345681&x-signature=kbwa7t%2by9jzqomau%2fqbd17csczs%3d

Number

最大值:+1.7976931348623157e+308

最小值:-1.7976931348623157e+308

0以上的最小值:5e-324

Infinity:正无穷

-Infinity:负无穷

NaN:非法数字(Not A Number)

二进制:0b 开头表示二进制,但是,并不是所有的浏览器都支持

八进制:0 开头表示八进制

十六进制:0x 开头表示十六进制

使用typeof检查一个Number类型的数据时(包括NaN 和 Infinity),会返回"number"。

Boolean

Undefined

注意:使用typeof对没有初始化和没有声明的变量,会返回“undefined”。

Null

Null 类型是第二个只有一个值的数据类型,这个特殊的值是 null。

undefined值实际上是由null值衍生出来的,所以如果比较undefined和null是否相等,会返回true。

注意:从语义上看null表示的是一个空的对象,所以使用typeof检查null会返回一个Object。

强制类型转换

将其它数值转换为字符串有三种方式:toString()、String()、 拼串。

调用被转换数据类型的toString()方法,该方法不会影响到原变量,它会将转换的结果返回,但是注意:null和undefined这两个值没有toString()方法,如果调用它们的方法,会报错。

var a = 123;

a = a.toString();

console.log(a);

console.log(typeof a);

调用String()函数,并将被转换的数据作为参数传递给函数,使用String()函数做强制类型转换时,对于Number和Boolean实际上就是调用的toString()方法,但是对于null和undefined,就不会调用toString()方法,它会将 null 直接转换为 “null”,将 undefined 直接转换为 “undefined”。

var a = 123;

a = String(a);

console.log(a);

console.log(typeof a);

var b = undefined;

b = String(b);

console.log(b);

console.log(typeof b);

var c = null;

c = String(c);

console.log(c);

console.log(typeof c);

var a = 123;

a = a + "";

console.log(a);

console.log(typeof a);

转换为Number类型

有三个函数可以把非数值转换为数值:Number()、parseInt() 和parseFloat()。Number()可以用来转换任意类型的数据,而后两者只能用于转换字符串。parseInt()只会将字符串转换为整数,而parseFloat()可以将字符串转换为浮点数。

使用Number()函数

如果是纯数字的字符串,则直接将其转换为数字

如果字符串中有非数字的内容,则转换为NaN

如果字符串是一个空串或者是一个全是空格的字符串,则转换为0

true 转成 1

false 转成 0

null --> 数字

null 转成 0

undefined --> 数字

undefined 转成 NaN

这种方式专门用来对付字符串,parseInt() 把一个字符串转换为一个整数

例如:

var a = "123";

a = parseInt(a);

console.log(a);

console.log(typeof a);

举例:

var a = "123.456";

a = parseFloat(a);

console.log(a);

console.log(typeof a);

转换为Boolean类型

将其它的数据类型转换为Boolean,只能使用Boolean()函数。

使用Boolean()函数

数字 —> 布尔

除了0和NaN,其余的都是true

字符串 —> 布尔

除了空串,其余的都是true

null和undefined都会转换为false

对象也会转换为true

运算符

算术运算符

6788ea786dd3a0ae481bbfaccb5d50.pc_detail&x-expires=1661345681&x-signature=fybq15awu7n91c7tiw0mpkjmt%2ba%3d

关系运算符

d5b7bc56c62e1291209bd0032e4b1d.pc_detail&x-expires=1661345681&x-signature=xjymdocvfxpjtu7qclwmcmko4ye%3d

赋值运算符

492be3f3c8c70edfd4e3174cf7dcdb.pc_detail&x-expires=1661345681&x-signature=m9yzlnwde0roswkjjr0%2bjxzzcze%3d

逻辑运算符

7bf359215c24706f9bc4af326a6b2f.pc_detail&x-expires=1661345681&x-signature=4fllzd2ulro0c9aq%2fhbw4rgt9hi%3d

关于逻辑运算符我们可以具体探讨一下:

&& 如:&&可以对符号两侧的值进行运算并返回结果,运算规则如下:

两个值中只要有一个值为false,就返回false,只有两个值都为true时,才会返回true

JS中的“与”属于短路的与,如果第一个值为false,则不会检查第二个值

非布尔值时:如果两个都为true,则返回第二个值,如果两个值中有false,则返回靠前的false的值

|| 或:||可以对符号两侧的值进行运算并返回结果,运算规则如下:

两个值中只要有一个true,就返回true,只有两个值都为false,才会返回false

JS中的“或”属于短路的或,如果第一个值为true,则不会检查第二个值

非布尔值时:如果两个都为false ,则返回第二个值,如果两个值中有true,则返回靠前的true的值

"年龄太小":"年龄合适";

执行流程:如果condition为true,则执行语句1,并返回执行结果,如果为false,则执行语句2,并返回执行结果。

逗号运算符

运算符优先级

3639ad9798959ea86b65e40b4c5440.pc_detail&x-expires=1661345681&x-signature=n%2btzsn9cjcem5dzhwfe1k%2fqmrq4%3d

代码块 语句

前边我所说的表达式和运算符等内容可以理解成是我们一 门语言中的单词,短语。而语句(statement)就是我们这个语言中一句一句完 整的话了。语句是一个程序的基本单位,JavaScript的程序就是由一条一条语句构成的,每一条语句使用;结尾。

JavaScript中的语句默认是由上至下顺序执行的,但是我们也可以通过一些流程控制语句来控制语句的执行顺序。

代码块

条件语句

if…else

if(expression)

statement

var age = 16;

if (age < 18) {

console.log("未成年");

}

if(expression)

statement

else

statement

var age = 16;

if (age < 18) {

console.log("未成年");

} else {

console.log("已成年");

}

if(expression1)

statement

else if(expression2)

statement

else

statement

var age = 18;

if (age < 18) {

console.log("小于18岁了");

} else if (age == 18) {

console.log("已经18岁了");

} else {

console.log("大于18岁了")

}

switch…case

switch (语句) {

case 表达式1:

语句...

case 表达式2:

语句...

default:

语句...

}

var today = 1;

switch (today) {

case 1:

console.log("星期一");

break;

case 2:

console.log("星期二");

break;

case 3:

console.log("星期三");

break;

case 4:

console.log("星期四");

break;

case 5:

console.log("星期五");

break;

case 6:

console.log("星期六");

break;

case 7:

console.log("星期日");

break;

default:

console.log("输入错误");

}

循环语句

while

while(条件表达式){

语句...

}

var i = 1;

while (i <= 10) {

console.log(i);

i++;

}

do…while

do{

语句...

}while(条件表达式);

var i = 1;

do {

console.log(i);

i++;

} while (i <= 10);

for

for(初始化表达式 ; 条件表达式 ; 更新表达式){

语句...

}

for (var i = 1; i <= 10; i++) {

console.log(i);

}

跳转控制

outer: for (var i = 0; i < 10; i++) {

for (var j = 0; j < 10; j++) {

if (j == 5) {

break outer;

}

console.log(j);

}

}

对象基础

概述

Object类型,我们也称为一个对象,是JavaScript中的引用数据类型。它是一种复合值,它将很多值聚合到一起,可以通过名字访问这些值。对象也可以看做是属性的无序集合,每个属性都是一个名/值对。对象除了可以创建自有属性,还可以通过从一个名为原型的对象那里继承属性。除了字符串、数字、true、false、null和undefined之外,JavaScript中的值都是对象。

创建对象

var person = new Object();

person.name = "孙悟空";

person.age = 18;

console.log(person);

var person = {

name: "孙悟空",

age: 18

};

console.log(person);

访问属性

对象.属性名

对象[‘属性名’]

删除属性

delete 对象.属性名

var person = new Object();

person.name = "孙悟空";

person.age = 18;

console.log(person);

delete person.name

console.log(person);

遍历对象

for (var 变量 in 对象) {

}

var person = {

name: "zhangsan",

age: 18

}

for (var personKey in person) {

var personVal = person[personKey];

console.log(personKey + ":" + personVal);

}

数据类型梳理

基本数据类型

JavaScript中的变量可能包含两种不同数据类型的值:基本数据类型和引用数据类型。

JavaScript中一共有5种基本数据类型:String、Number、 Boolean、Undefined、Null。

基本数据类型的值是无法修改的,是不可变的。

基本数据类型的比较是值得比较,也就是只要两个变量的值相等,我们就认为这两个变量相等

引用数据类型

引用类型的值是保存在内存中的对象。

当一个变量是一个对象时,实际上变量中保存的并不是对象本身,而是对象的引用。

当从一个变量向另一个变量复制引用类型的值时,会将对象的引用复制到变量中,并不是创建一个新的对象。

这时,两个变量指向的是同一个对象。因此,改变其中一个变量会影响另一个。

栈和堆梳理

JavaScript在运行时数据是保存到栈内存和堆内存当中的。

简单来说栈内存用来保存变量和基本类型,堆内存是用来保存对象。

我们在声明一个变量时,实际上就是在栈内存中创建了一个空间用来保存变量。

如果是基本类型则在栈内存中直接保存,如果是引用类型则会在堆内存中保存,变量中保存的实际上对象在堆内存中的地址。

当我们写了下边这几句代码的时候,栈内存和堆内存的结构如下:

var a = 123;

var b = true;

var c = "hello";

var d = {name: 'sunwukong', age: 18};

cb23ffc924c4432643230dcca322e9.pc_detail&x-expires=1661345681&x-signature=j72kaoai9hg7v9%2bpepi2gcbsyme%3d

函数

概述

函数是由一连串的子程序(语句的集合)所组成的,可以被外部程序调用,向函数传递参数之后,函数可以返回一定的值。

通常情况下,JavaScript代码是自上而下执行的,不过函数体内部的代码则不是这样。如果只是对函数进行了声明,其中的代码并不会执行,只有在调用函数时才会执行函数体内部的代码。

这里要注意的是JavaScript中的函数也是一个对象,使用typeof检查一个函数对象时,会返回function。

函数创建

var 函数名 = new Function("执行语句");var fun = new Function("console.log('这是我的第一个函数');");

函数调用

// 函数声明

var fun = function () {

console.log("哈哈,我执行啦!");

}

// 函数调用

fun();

// 函数声明

var sum = function (num1, num2) {

var result = num1 + num2;

console.log("num1 + num2 = " + result);

}

// 函数调用

sum(10, 20);

函数参数

JS中的所有的参数传递都是按值传递的,也就是说把函数外部的值赋值给函数内部的参数,就和把值从一个变量赋值给另一个变量是一样的,在调用函数时,可以在()中指定实参(实际参数),实参将会赋值给函数中对应的形参

调用函数时,解析器不会检查实参的类型,所以要注意,是否有可能会接收到非法的参数,如果有可能,则需要对参数进行类型的检查,函数的实参可以是任意的数据类型

调用函数时,解析器也不会检查实参的数量,多余实参不会被赋值,如果实参的数量少于形参的数量,则没有对应实参的形参将是undefined

函数返回值

可以使用 return 来设置函数的返回值,return后的值将会作为函数的执行结果返回,可以定义一个变量,来接收该结果。

注意:在函数中return后的语句都不会执行,如果return语句后不跟任何值就相当于返回一个undefined,如果函数中不写return,则也会返回undefined,return后可以跟任意类型的值

语法格式:return 值

案例演示:

function sum(num1, num2) {

return num1 + num2;

}

var result = sum(10, 20);

console.log(result);

嵌套函数

匿名函数

立即执行函数

对象中的函数

this对象

解析器在调用函数每次都会向函数内部传递进一个隐含的参数,这个隐含的参数就是this,this指向的是一个对象,这个对象我们称为函数执行的上下文对象,根据函数的调用方式的不同,this会指向不同的对象

以函数的形式调用时,this永远都是window

以方法的形式调用时,this就是调用方法的那个对象

案例演示:

//创建一个全局变量name

var name = "全局变量name";

//创建一个函数

function fun() {

console.log(this.name);

}

//创建一个对象

var obj = {

name: "孙悟空",

sayName: fun

};

//我们希望调用obj.sayName()时可以输出obj的名字而不是全局变量name的名字

obj.sayName();

对象进阶

用工厂方法创建对象

var person1 = {

name: "孙悟空",

age: 18,

sayName: function () {

console.log(this.name);

}

};

var person2 = {

name: "猪八戒",

age: 19,

sayName: function () {

console.log(this.name);

}

};

var person3 = {

name: "沙和尚",

age: 20,

sayName: function () {

console.log(this.name);

}

};

console.log(person1);

console.log(person2);

console.log(person3);

// 使用工厂模式创建对象

function createPerson(name, age) {

// 创建新的对象

var obj = new Object();

// 设置对象属性

obj.name = name;

obj.age = age;

// 设置对象方法

obj.sayName = function () {

console.log(this.name);

};

//返回新的对象

return obj;

}

var person1 = createPerson("孙悟空", 18);

var person2 = createPerson("猪八戒", 19);

var person3 = createPerson("沙和尚", 20);

console.log(person1);

console.log(person2);

console.log(person3);

用构造函数创建对象

// 使用工厂模式创建对象

function createPerson(name, age) {

// 创建新的对象

var obj = new Object();

// 设置对象属性

obj.name = name;

obj.age = age;

// 设置对象方法

obj.sayName = function () {

console.log(this.name);

};

//返回新的对象

return obj;

}

for (var i = 1; i <= 1000; i++) {

var person = createPerson("person" + i, 18);

console.log(typeof person);

}

那这构造函数到底是什么呢?我来解释一下:

构造函数:构造函数就是一个普通的函数,创建方式和普通函数没有区别,不同的是构造函数习惯上首字母大写,构造函数和普通函数的还有一个区别就是调用方式的不同,普通函数是直接调用,而构造函数需要使用new关键字来调用。

那构造函数是怎么执行创建对象的过程呢?我再来解释一下:

调用构造函数,它会立刻创建一个新的对象

将新建的对象设置为函数中this,在构造函数中可以使用this来引用新建的对象

逐行执行函数中的代码

将新建的对象作为返回值返回

你会发现构造函数有点类似工厂方法,但是它创建对象和返回对象都给我们隐藏了,使用同一个构造

函数创建的对象,我们称为一类对象,也将一个构造函数称为一个类。我们将通过一个构造函数创建的对象,称为是该类的实例。

现在,this又出现了一种新的情况,为了不让大家混淆,我再来梳理一下:

当以函数的形式调用时,this是window

当以方法的形式调用时,谁调用方法this就是谁

当以构造函数的形式调用时,this就是新创建的那个对象

我们可以使用 instanceof 运算符检查一个对象是否是一个类的实例,它返回true或false

语法格式:对象 instanceof 构造函数

原型

在前一节中,我们学习了使用构造函数的方式进行创建对象,但是,它还是存在一个问题,那就是,你会发现,每一个对象的属性不一样这是一定的,但是它的方法似乎好像是一样的,如果我创建1000个对象,那岂不是内存中就有1000个相同的方法,那要是有10000个,那对内存的浪费可不是一点半点的,我们有没有什么好的办法解决,没错,我们可以把函数抽取出来,作为全局函数,在构造函数中直接引用就可以了,上代码:

// 使用构造函数来创建对象

function Person(name, age) {

// 设置对象的属性

this.name = name;

this.age = age;

// 设置对象的方法

this.sayName = sayName

}

// 抽取方法为全局函数

function sayName() {

console.log(this.name);

}

var person1 = new Person("孙悟空", 18);

var person2 = new Person("猪八戒", 19);

var person3 = new Person("沙和尚", 20);

person1.sayName();

person2.sayName();

person3.sayName();

在全局作用域中定义函数却不是一个好的办法,为什么呢?因为,如果要是涉及到多人协作开发一个项目,别人也有可能叫sayName这个方法,这样在工程合并的时候就会导致一系列的问题,污染全局作用域,那该怎么办呢?有没有一种方法,我只在Person这个类的全局对象中添加一个函数,然后在类中引用?答案肯定是有的,这就需要原型对象了,我们先看看怎么做的,然后在详细讲解原型对象。

// 使用构造函数来创建对象

function Person(name, age) {

// 设置对象的属性

this.name = name;

this.age = age;

}

// 在Person类的原型对象中添加方法

Person.prototype.sayName = function() {

console.log(this.name);

};

var person1 = new Person("孙悟空", 18);

var person2 = new Person("猪八戒", 19);

var person3 = new Person("沙和尚", 20);

person1.sayName();

person2.sayName();

person3.sayName();

那原型(prototype)到底是什么呢?

我们所创建的每一个函数,解析器都会向函数中添加一个属性prototype,这个属性对应着一个对象,这个对象就是我们所谓的原型对象,即显式原型,原型对象就相当于一个公共的区域,所有同一个类的实例都可以访问到这个原型对象,我们可以将对象中共有的内容,统一设置到原型对象中。

如果函数作为普通函数调用prototype没有任何作用,当函数以构造函数的形式调用时,它所创建的对象中都会有一个隐含的属性,指向该构造函数的原型对象,我们可以通过__proto__(隐式原型)来访问该属性。当我们访问对象的一个属性或方法时,它会先在对象自身中寻找,如果有则直接使用,如果没有则会去原型对象中寻找,如果找到则直接使用。

以后我们创建构造函数时,可以将这些对象共有的属性和方法,统一添加到构造函数的原型对象中,这样就不用分别为每一个对象添加,也不会影响到全局作用域,就可以使每个对象都具有这些属性和方法了。

原型链

749b0eb8a98f8ec34c1d0ae0fd5d02.pc_detail&x-expires=1661345681&x-signature=evqztcr9ow9vqgjjckxgwkz%2b67k%3d

注意:Object对象是所有对象的祖宗,Object的原型对象指向为null,也就是没有原型对象

// 使用构造函数来创建对象

function Person(name, age) {

// 设置对象的属性

this.name = name;

this.age = age;

}

//创建对象的一个实例对象

var p = new Person("张三", 20);

console.log(p.toString());

9c79c79cfd4482fa6b0084b8044f5d.pc_detail&x-expires=1661345681&x-signature=dg4rpcibuclpvg8ygawvr9d6jzc%3d

// 字符串

var str = "Hello";

console.log(str.toString());

// 数字

var num = 15.26540;

console.log(num.toString());

// 布尔

var bool = true;

console.log(bool.toString());

// Object

var obj = {name: "张三", age: 18};

console.log(obj.toString());

// 数组

var array = ["CodePlayer", true, 12, -5];

console.log(array.toString());

// 日期

var date = new Date(2013, 7, 18, 23, 11, 59, 230);

console.log(date.toString());

// 错误

var error = new Error("自定义错误信息");

console.log(error.toString());

// 函数

console.log(Function.toString());

hasOwnProperty方法

// 创造一个构造函数

function MyClass() {

}

// 向MyClass的原型中添加一个name属性

MyClass.prototype.name = "我是原型中的名字";

// 创建一个MyClass的实例

var mc = new MyClass();

mc.age = 18;

// 使用in检查对象中是否含有某个属性时,如果对象中没有但是原型中有,也会返回true

console.log("age" in mc);

console.log("name" in mc);

// 创造一个构造函数

function MyClass() {

}

// 向MyClass的原型中添加一个name属性

MyClass.prototype.name = "我是原型中的名字";

// 创建一个MyClass的实例

var mc = new MyClass();

mc.age = 18;

// 使用in检查对象中是否含有某个属性时,如果对象中没有但是原型中有,也会返回true

console.log("age" in mc);

console.log("name" in mc);

// 可以使用对象的hasOwnProperty()来检查对象自身中是否含有该属性,使用该方法只有当对象自身中含有属性时,才会返回true

console.log(mc.hasOwnProperty("age"));

console.log(mc.hasOwnProperty("name"));

// 创造一个构造函数

function MyClass() {

}

// 向MyClass的原型中添加一个name属性

MyClass.prototype.name = "我是原型中的名字";

// 创建一个MyClass的实例

var mc = new MyClass();

mc.age = 18;

// 检查当前对象

console.log(mc.hasOwnProperty("hasOwnProperty"));

// 检查当前对象的原型对象

console.log(mc.__proto__.hasOwnProperty("hasOwnProperty"));

// 检查当前对象的原型对象的原型对象

console.log(mc.__proto__.__proto__.hasOwnProperty("hasOwnProperty"));

对象继承

前边我们一直在说继承,那什么是继承?它有什么作用?如何实现继承?将会是本章节探讨的问题。

面向对象的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象。但是在JavaScript中没有类的概念,前边我们说所的类只是我们自己这么叫,大家要清楚。因此它的对象也与基于类的对象有所不同。实际上,JavaScript语言是通过一种叫做原型(prototype)的方式来实现面向对象编程的。

原型链继承

// 定义父类型构造函数

function SupperType() {

this.supProp = 'Supper property';

}

// 给父类型的原型添加方法

SupperType.prototype.showSupperProp = function () {

console.log(this.supProp);

};

// 定义为子类型的构造函数

function SubType() {

this.subProp = 'Sub property';

}

// 创建父类型的对象赋值给子类型的原型

SubType.prototype = new SupperType();

// 将子类型原型的构造属性设置为子类型

SubType.prototype.constructor = SubType;

// 给自己类型原型添加方法

SubType.prototype.showSubProp = function () {

console.log(this.subProp)

};

// 创建子类型的对象: 可以调用父类型的方法

var subType = new SubType();

subType.showSupperProp();

subType.showSubProp();

借用构造函数继承

核心思想: 使用.call()和.apply()将父类构造函数引入子类函数,使用父类的构造函数来增强子类实例,等同于复制父类的实例给子类

基本做法:

定义父类型构造函数

定义为子类型的构造函数

给自己类型的原型添加方法

创建子类型的对象然后调用

案例演示:

借用构造函数继承的重点就在于SuperType**.call(this, name)**,调用了SuperType构造函数,这样,

// 定义父类型构造函数

function SuperType(name) {

this.name = name;

this.showSupperName = function () {

console.log(this.name);

};

}

// 定义为子类型的构造函数

function SubType(name, age) {

// 在子类型中调用call方法继承自SuperType

SuperType.call(this, name);

this.age = age;

}

// 给自己类型的原型添加方法

SubType.prototype.showSubName = function () {

console.log(this.name);

};

// 创建子类型的对象然后调用

var subType = new SubType("孙悟空", 20);

subType.showSupperName();

subType.showSubName();

console.log(subType.name);

console.log(subType.age);

组合继承

function Person(name, age) {

this.name = name;

this.age = age;

}

Person.prototype.setName = function (name) {

this.name = name;

};

function Student(name, age, price) {

Person.call(this, name, age); // 为了得到父类型的实例属性和方法

this.price = price; // 添加子类型私有的属性

}

Student.prototype = new Person(); // 为了得到父类型的原型属性和方法

Student.prototype.constructor = Student; // 修正constructor属性指向

Student.prototype.setPrice = function (price) { // 添加子类型私有的方法

this.price = price;

};

var s = new Student("孙悟空", 24, 15000);

console.log(s.name, s.age, s.price);

s.setName("猪八戒");

s.setPrice(16000);

console.log(s.name, s.age, s.price);

注意:这个方法是JavaScript中最常用的继承模式

垃圾回收

垃圾回收(GC):就像人生活的时间长了会产生垃圾一样,程序运行过程中也会产生垃圾,这些垃圾积攒过多以后,会导致程序运行的速度过慢,所以我们需要一个垃圾回收的机制,来处理程序运行过程中产生垃圾。

当一个对象没有任何的变量或属性对它进行引用,此时我们将永远无法操作该对象,此时这种对象就是一个垃圾,这种对象过多会占用大量的内存空间,导致程序运行变慢,所以这种垃圾必须进行清理。

在JS中拥有自动的垃圾回收机制,会自动将这些垃圾对象从内存中销毁,我们不需要也不能进行垃圾回收的操作,我们需要做的只是要将不再使用的对象设置null即可。

案例演示:

// 使用构造函数来创建对象

function Person(name, age) {

// 设置对象的属性

this.name = name;

this.age = age;

}

var person1 = new Person("孙悟空", 18);

var person2 = new Person("猪八戒", 19);

var person3 = new Person("沙和尚", 20);

person1 = null;

person2 = null;

person3 = null;

作用域

声明提前

变量的声明提前:使用var关键字声明的变量,会在所有的代码执行之前被声明(但是不会赋值),但是如果声明变量时不使用var关键字,则变量不会被声明提前

函数的声明提前:使用函数声明形式创建的函数 function 函数名(){} ,它会在所有的代码执行之前就被创建,所以我们可以在函数声明前来调用函数。使用函数表达式创建的函数,不会被声明提前,所以不能在声明前调用

作用域

全局作用域

直接编写在script标签中的JavaScript代码,都在全局作用域

全局作用域在页面打开时创建,在页面关闭时销毁

在全局作用域中有一个全局对象window,它代表的是一个浏览器的窗口,它由浏览器创建,我们可以直接使用

在全局作用域中:

创建的变量都会作为window对象的属性保存

创建的函数都会作为window对象的方法保存

全局作用域中的变量都是全局变量,在页面的任意的部分都可以访问的到

9c6f42b872cf368aebfeb7cc69aea3.pc_detail&x-expires=1661345681&x-signature=zzxwimbhvbhlizr1cifpygzuuwe%3d

好了今天的内容分享就到这里感谢你的持续关注,我们下期再会!

猜你喜欢

版权所有 Copyright©2023 餐饮美食网 版权所有

粤ICP备15109582号

联系邮箱:187348839@qq.com