构造函数和原型对象
admin
2024-01-21 16:19:06

一、构造函数和原型对象

        1、构造函数:

                作用:用于创建对象,初始化对象的属性

//在ES5中创建函数:
function Student(id,name) {this.id = idthis.name = name
}
let s1 new = new Student {construction (id,name) {this.id = idthis.name = name}
}
let s1 new Student (101,'张二')//自定调用construction函数

        注意:通常吧构造函数创建对象的过程称为类的实例化,对象就是类的示例

        2、构造函数的成员或类的成员

                (1)什么是成员?类的成员包括属性、方法(行为),通常将属性称为成员变量,把方法(行为)称为成员方法(成员函数)

                (2)成员变量又称为实例变量:用类或构造函数创建的对象都有相同的属性和方法

class Person {constructor (id,name) {this.id = idthis.name = name}display () {console.log("编号:",this.id)console.log("姓名:",this.name)}
}let p1 = new Person('101','张三')
let p2 = new Person('102','李四')//对象p1和p2的属性和方法是相同的,但它们在内存中的存储空间是不同的

                (3)静态成员:通过构造函数名和类名直接访问的成员,不属于任何对象,为类的所有对象(实例共享的)

                        静态成员也成为类成员

//ES6中的类额静态成员
class Student{constructor( studentId, studentName){Student. schoolName = '西北工业大学' //schoolName是静态成员,通过类名直接访问:类成员为类的的所有对象共享this. studentId = studentId //studentId是实例成员,属于具体的实例(对象)this. studentName = studentName //studentName是实例成员,属于具体的实例(对象)}display(){console.log("学校: ", Student. schoolName )console.log("学号: ", this. studentId )console.log("姓名: ", this. studentName )}
}let s1 = new Student( '1001' ,'杨过')let s2=new Student( '1002' ,'小龙女')let s3=new Student( '1003' ,'李莫愁')s1.display()console.log('--------------')s2.display()console.log('--------------')s3.display()console.log('--------------')Student.schoolName='中国西北工业大学's3.display()s2.display()//ES5中的定义方法
function Student(studentId, studentName) {this.studentId = studentIdthis.studentName = studentNameStudent.schoolName = '西北工业大学' //静态成员this.display = function () {console.log('学校: ', Student.schoolName)console.log('学号: ', this.studentId)console.log('姓名: ', this.studentName)}
}

                (4)构造方法和类的区别:

                        a、构造函数中定义的方法,本质是属性,需要占用存储空间

                        b、在类中定义的方法,不是属性,不需要占用存储空间。即在创建类的对象的过程中,只需要给对象的属性分配存储控件,对象的方法不占空间,因此节省了内存空间。

        3、原型对象:

                (1)每个构造函数都存在一个原型对象,可以通过构造函数的prototype属性访问

                        a、构造函数的原型对象:是object类型,通过prototype属性可以访问到

                        b、作用:通过原型对象可以给构造函数增加新的功能,这些新的功能可以共享给用构造函数创建的所有对象

                (2)对象的原型对象:js中每个对象都有一个原型对象,通过 _ _proto _ _属性来获取

                (3)实例对象与原型和对象的关系

                (4)对象的构造函数:通过对象的原型对象来采取。在对象的原型对象有constructor属性,代表了对象的构造函数

        示例:用赋值方式修改原型对象为新的对象,就无法访问构造函数

                (5)构造函数、原型对象和实例对象之间的关系

                (6)原型链

                        a、通过构造函数的prototype属性找到构造函数的原型对象,通过构造函数的原型对象的constructor找到构造函数

                        b、通过构造函数创建实例对象,然后通过实例对象的_ _ proto _ _属性可以找到对象的原型对象,也可以通过对象的原型对象的constructor找到构造函数

把上面两种找原型对象和构造函数的过程称为原型链

                (7)原型对象的原型对象:原型对象也是一个对象,那么它也有原型对象

function Person(){this.sayHello = function(){console.log("Hello Woniu!");}
}
//输出Person的原型对象
console.log('Person的原型对象:',Person.prototype) //constructor ƒ Person()
//输出Person的原型对象的原型对象
console.log('Person的原型对象的原型对象:',Person.prototype.__proto__)

                (7)原型链结构特点

                        a、 每个构造函数都有一个prototype属性指向原型对象。

                        b、原型对象通过constructor属性指向构造函数。

                        c、通过实例对象的proto属性可以访问原型对象。

                        d、Object的原型对象的proto属性为null。

                (8)JavaScript中的成员(属性)的查找机制

                        a、首先查找对象中国有没有成员(属性)

                        b、如果没有找到,就继续查找原型对象的原型对象

                        c、如果直到最后都没有找到,则返回undefined。

function Person(){this.sayHello=function(){console.log("玛卡巴卡");}
}
//输出Person的原型对象
console.log('Person的原型对象:',Person.prototype); //constructor f Person()
//输出Person的原型对象的原型对象
console.log('Person的原型对象的原型对象:',Person.prototype.__proto__);//创建Person对象
let p1=new Person()
console.log('###',p1.userName); //p1的原型对象Person中没有userName成员,继续在Person的原型对象Object中找,没有找到
Object.prototype.userName='张三' //在Object的原型对象上定义userN属性
console.log('-----',p1.userName); //在输出p1,userName时会逐层的向上查找,最终在Object的原型对象找到,就输出'张三'

二、this的指向问题

        1、在构造函数内部this指向新创建的对象

        2、直接通过函数名调用函数时,this指向的是全局对象window

        3、如果将函数作为对象的方法调用,this将会指向该对象

        练习:利用原型对象扩展数组(Array)方法

                Array的内置方法中有没有求数组元素的和

//通过原型对象扩展Array的方法:求数组元素的和
Array.prototype.sum = function () {let s = 0for (let i = 0; i < this.length; i++) { //this代表的是调用sum函数的数组对象 s = s + this[i]}return s;
}
let arr = new Array(10, 20, 30, 40, 50)
let t = arr.sum()
console.log(t);

        练习:在String的原文对象上判断回文字符串函数,然后测试

String.prototype.fn=function(){//方式一// let start=0// let end=this.length-1// while(start0;i--){str1+=str[i]if(str1!=str){console.log('是回文字符串');break}else{console.log('不是回文字符串');break}}
}
let str="abccba";
//方式一
// console.log(str.fn());//方式二
str.fn();

三、JavaScript中的错误处理

        1、使用try--catch进行处理

try{
代码段  //有可能会产生错误
}catch(错误对象){
代码的 //产生错误后执行的代码
}执行过程:(1)若try{}中的代码出现了错误,js会根据错误的类型,生成错误对象,然后将该错误对象跑出去(2)catch会接受try抛出的错误对象,然后对象错误进行处理(3)若try{}中的代码出现了错误,try{}中余下的代码就不执行,转到catch下执行(4)最后执行try---catch结构之外的代码let obj={}
try{obj.show()
}catch (error){console.log(error.message)
};
console.log('-----------------');

        2、常见的错误类型

                (1)Error:表示普通错误,其他的错误对象都是从该对象派生而来

                (2)RangeError:数值超出有效范围

                (3)ReferenceError:引用一个不存在的变量

                (4)SyntaxError:语法错误

                (5)TypeError:类型错误

        3、throw:是JavaScript的关键字,用于在try{}中抛出错误对象

四、查找算法

        1、顺序查找:按数组或集合中元素的存放顺序依次操作(按顺序依次比较每个元素)

let arr = [78, 98, 25, 45, 99, 115, 87]
//在数组arr中产找一个数,若找到返回其下标,若没有找到返回-1
function findNum(arr, num) {for (let i = 0; i < arr.length; i++) {if (arr[i] === num) {return i}}return -1
}
let k = findNum(arr, 99)
console.log(k);

        2、折半查找(二分法查找)

                (1)前提条件:被查找的集合或数组必须是有序的

                (2)每次查找是先和被查找区间的中间元素进行比较,若大于中间元素,则就在被查找区间的右边的区间中找,若小于中间元素则在被查找区间的左边区间中查找,如此循环直到查找结束

相关内容

热门资讯

曹操有25个儿子,为何还让司马... 曹操有25个儿子,为何还让司马懿夺了权?只因一个致命弱点?下面趣历史小编为大家详细介绍一下相关内容。...
汉武帝宁愿杀了大侠郭解,为何也... 今天趣历史小编为大家带来了一篇关于汉武帝的文章,欢迎阅读哦~匈奴的崛起,与汉民族走向统一,几乎是在同...
揭秘:为什么魏晋名士那么爱喝酒... 今天趣历史小编为大家带来了一篇关于魏晋的文章,欢迎阅读哦~魏晋风度在我国历史上是个非常有名的文学语码...
慈禧守寡是才26岁 她是怎么度... 还不知道:慈禧守寡是怎么度过深宫的生活的读者,下面趣历史小编就为大家带来详细介绍,接着往下看吧~慈禧...
《三国》五虎上将,去掉一个让魏... 《三国》五虎上将,去掉一个让魏延顶替,换掉谁更合适?下面趣历史小编为大家详细介绍一下相关内容。在看小...