当前位置: 首页 > news >正文

桓台网站推广广元网站建设工作室

桓台网站推广,广元网站建设工作室,邢台天九建设有限公司网站,帮忙做简历的网站在 JavaScript 中#xff0c;常见的继承方式有以下七种#xff1a;大厂面试题分享 面试题库前后端面试题库 #xff08;面试必备#xff09; 推荐#xff1a;★★★★★地址#xff1a;前端面试题库1. 原型链继承原型链继承是 JavaScript 中一种基于原型的继承方式#…在 JavaScript 中常见的继承方式有以下七种大厂面试题分享 面试题库前后端面试题库 面试必备 推荐★★★★★地址前端面试题库1. 原型链继承原型链继承是 JavaScript 中一种基于原型的继承方式它通过将一个构造函数的实例作为另一个构造函数的原型从而实现继承。具体来说就是在子类的构造函数中通过 Child.prototype new Parent() 的方式来继承父类的属性和方法。以下是一个实现原型链继承的示例代码// 定义父类构造函数functionParent(name) {this.name name; }// 父类原型上的方法Parent.prototype.sayName function() {console.log(My name is this.name); }// 定义子类构造函数functionChild(name, age) {this.age age; }// 将子类的原型设置为父类的实例Child.prototype newParent();// 子类原型上的方法Child.prototype.sayAge function() {console.log(I am this.age years old); }// 创建子类实例var child newChild(Tom, 10);// 调用子类实例的方法 child.sayName(); // My name is Tom child.sayAge(); // I am 10 years old复制代码在上面的示例代码中我们首先定义了一个父类构造函数 Parent并在其原型上定义了一个方法 sayName。然后我们定义了一个子类构造函数 Child并通过将子类的原型设置为父类的实例来实现继承。最后我们创建了一个子类实例 child并调用其方法来验证继承是否成功。优点简单易懂原型链继承是一种简单的继承方式易于理解和实现。父类方法更新会自动同步到子类实例由于子类实例的原型指向父类实例所以父类的方法更新会自动同步到子类实例中。可以重用父类方法由于子类实例可以访问父类的原型因此可以重用父类的方法从而减少代码量。缺点所有子类实例共享原型对象由于所有子类实例的原型都指向同一个对象因此一个实例对原型对象的修改会影响到其他实例。无法向父类构造函数传递参数原型链继承无法向父类构造函数传递参数因此子类实例无法向父类构造函数传递参数也无法对父类实例进行初始化。无法实现多继承由于JavaScript中一个对象只能有一个原型对象因此原型链继承无法实现多继承。2. 借用构造函数继承JavaScript中的借用构造函数继承是一种通过调用父类构造函数来实现继承的方式。这种继承方式有以下特点子类实例拥有了父类构造函数中定义的属性和方法。子类实例与父类实例之间不存在原型链的关系因此可以避免共享原型对象带来的问题。子类无法重用父类原型对象上的方法。以下是一个借用构造函数继承的示例代码functionAnimal(name) {this.name name; }Animal.prototype.sayName function() {console.log(My name is this.name); }functionDog(name, age) {Animal.call(this, name); // 借用Animal构造函数并将this指向Dog实例this.age age; }let dog1 newDog(旺财, 2); let dog2 newDog(小白, 1);console.log(dog1.name); // 旺财console.log(dog2.age); // 1 dog1.sayName(); // TypeError: dog1.sayName is not a function复制代码在上面的代码中Dog类通过调用Animal构造函数来实现继承从而拥有了Animal类中定义的属性和方法。由于子类实例与父类实例之间不存在原型链的关系因此修改一个实例的属性不会影响到其他实例。但是需要注意的是由于子类实例无法访问父类原型对象上的方法因此在上面的代码中dog1实例调用sayName()方法会报错。如果需要在子类中重用父类原型对象上的方法可以考虑使用组合继承或寄生组合式继承。优点可以向父类构造函数传递参数借用构造函数继承可以向父类构造函数传递参数从而可以对父类实例进行初始化。避免了原型对象共享的问题由于借用构造函数继承创建了一个新的对象因此避免了原型对象共享的问题。可以实现多继承由于JavaScript中可以在一个构造函数中调用多个构造函数因此可以通过借用构造函数继承来实现多继承。缺点无法重用父类方法由于借用构造函数继承创建了一个新的对象因此无法重用父类的方法。父类方法更新不会自动同步到子类实例由于借用构造函数继承创建了一个新的对象因此父类的方法更新不会自动同步到子类实例中。无法访问父类原型上的属性和方法由于借用构造函数继承只继承了父类的实例属性和方法因此无法访问父类原型上的属性和方法。如果需要访问父类原型上的属性和方法仍然需要通过将子类的原型指向父类的实例来实现。3. 组合继承JavaScript中的组合继承是一种结合借用构造函数和原型链继承的方式它的核心思想是使用借用构造函数继承实例属性和方法使用原型链继承共享属性和方法。以下是一个组合继承的示例代码functionAnimal(name) {this.name name; }Animal.prototype.sayName function() {console.log(My name is this.name); }functionDog(name, age) {Animal.call(this, name); // 借用Animal构造函数并将this指向Dog实例this.age age; }Dog.prototype newAnimal(); // 原型链继承Animal类的属性和方法Dog.prototype.constructor Dog; // 修复构造函数指向let dog1 newDog(旺财, 2); let dog2 newDog(小白, 1);console.log(dog1.name); // 旺财console.log(dog2.age); // 1 dog1.sayName(); // My name is 旺财复制代码在上面的代码中Dog类通过借用Animal构造函数继承实例属性和方法通过原型链继承Animal类的属性和方法。由于子类实例与父类实例之间不存在原型链的关系因此修改一个实例的属性不会影响到其他实例。同时子类实例可以重用父类原型对象上的方法。需要注意的是由于在上面的代码中通过Dog.prototype new Animal()创建了一个新的Animal实例因此在创建Dog类时会调用两次Animal构造函数造成了性能上的浪费。可以使用寄生组合式继承来解决这个问题。具体来说组合继承通过将父类的构造函数借用到子类中从而实现了父类属性的继承同时通过将子类的原型设置为一个新的父类实例从而实现了父类方法的继承。这种继承方式具有以下优缺点优点父类的构造函数可以传递参数并且不会影响到其他实例。子类实例可以访问父类原型对象上的方法可以重用父类的方法。可以实现多继承。实现简单、易于理解。缺点子类实例会同时拥有自己的属性和方法以及父类的属性和方法可能导致内存浪费和属性名冲突的问题。在创建子类实例时父类构造函数会被调用两次可能会影响性能。4. 原型式继承JavaScript中的原型式继承是一种基于已有对象创建新对象的继承方式它利用了对象的动态特性通过封装一个函数来实现继承。该函数接收一个用作新对象原型的对象作为参数并返回一个新对象从而实现了继承。该方式与借用构造函数继承类似但它并不涉及到构造函数和实例的概念。原型式继承具有以下特点基于已有对象创建新对象。可以使用Object.create()方法实现。可以将一个对象作为另一个对象的原型对象。可以使用原型对象的属性和方法但不会影响到原型对象本身。下面是一个使用原型式继承的示例代码let animal {type: animal,sayType: function() {console.log(I am a this.type);} };let dog Object.create(animal); // 使用animal对象作为dog对象的原型 dog.type dog;dog.sayType(); // I am a dog复制代码在上面的代码中animal对象拥有一个type属性和一个sayType方法dog对象通过使用animal对象作为原型对象来实现了继承。因此dog对象可以使用原型对象的属性和方法但并不会影响到原型对象本身。此外通过给dog对象添加一个type属性也可以覆盖原型对象的type属性实现对父对象属性的重写。原型式继承的优点在于可以方便地实现对象的复用但也容易导致对象之间的耦合不易于维护。具体来说它通过创建一个空对象并将其原型设置为一个已有对象然后向这个空对象中添加属性和方法来实现继承。原型式继承具有以下优缺点优点简单、易于理解和实现。可以基于一个对象创建多个对象实现对象复用。缺点父对象的引用属性会被所有子对象共享因此子对象的修改会影响到其他子对象。子对象无法像传统的类继承一样判断自己是否是父对象的实例。无法实现多继承。5. 寄生式继承JavaScript中的寄生式继承是一种基于已有对象创建新对象的继承方式类似于原型式继承。它的主要区别是在新创建的对象上增加一个方法而这个方法的作用是以某种方式增强对象然后返回这个对象。这种继承方式得名于“寄生”因为增强对象的方法通常是基于已有的对象进行“寄生”而得名。寄生式继承的优点是可以封装继承过程并且可以向对象中添加一些额外的属性和方法。但是和原型式继承一样也存在父对象的引用属性被所有子对象共享、无法判断实例是否是父对象的实例等问题。以下是一个使用寄生式继承的示例代码functioncreateAnimal(type) {let animal {type: type,sayType: function() {console.log(I am a this.type);}};// 基于animal对象进行寄生增强let dog Object.create(animal);dog.bark function() {console.log(woof woof);};return dog; }let myDog createAnimal(canine); myDog.sayType(); // I am a canine myDog.bark(); // woof woof复制代码在上面的代码中我们定义了一个名为createAnimal的函数用于创建一个继承自animal对象的新对象。我们在这个新对象上增加了一个bark方法用于让对象发出叫声。最后我们返回这个新对象并将它赋值给myDog变量。通过这样的方式我们成功地实现了寄生式继承。具体来说它在原型式继承的基础上增加了一个包装函数该函数用于封装继承过程中的一些增强行为。寄生式继承具有以下优缺点优点简单、易于理解和实现。可以基于一个对象创建多个对象实现对象复用。可以在不修改原对象的情况下对继承过程进行一些增强例如添加新的属性和方法。缺点父对象的引用属性会被所有子对象共享因此子对象的修改会影响到其他子对象。子对象无法像传统的类继承一样判断自己是否是父对象的实例。增强行为可能会带来一定的性能开销。可能会导致代码的可读性降低。6. 寄生式组合继承JavaScript中的寄生式组合继承是一种结合了组合继承和寄生式继承的继承方式。具体来说它在组合继承的基础上通过寄生式继承来解决组合继承中重复调用父构造函数的问题。下面是一个使用寄生式组合继承的示例代码functionAnimal(name) {this.name name;this.type mammal; }Animal.prototype.sayName function() {console.log(My name is this.name); };functionDog(name, breed) {Animal.call(this, name);this.breed breed; }// 使用寄生式继承继承Animal.prototypeDog.prototype Object.create(Animal.prototype); Dog.prototype.constructor Dog;Dog.prototype.sayBreed function() {console.log(I am a this.breed); };let myDog newDog(Max, Golden Retriever); myDog.sayName(); // My name is Max myDog.sayBreed(); // I am a Golden Retriever复制代码在上面的代码中我们定义了Animal和Dog两个构造函数其中Animal构造函数定义了一个name属性和一个sayName()方法Dog构造函数在Animal的基础上添加了一个breed属性和一个sayBreed()方法。为了实现寄生式组合继承我们使用Object.create()方法基于Animal.prototype创建了一个新的对象并将其赋值给Dog.prototype从而使得Dog.prototype的原型链指向了Animal.prototype。同时我们还将Dog.prototype的constructor属性设置为Dog以保证继承链的完整性。最后我们通过调用Animal构造函数并将this指向Dog对象实现了对Animal属性的继承。通过这种方式我们既避免了组合继承中重复调用父构造函数的问题又保留了寄生式继承的灵活性实现了一个高效而且灵活的继承方式。优点实现了属性和方法的完整继承。避免了组合继承中重复调用父类构造函数的问题提高了性能。可以在不修改原对象的情况下对继承过程进行一些增强例如添加新的属性和方法。缺点增加了一层包装函数可能会带来一定的性能开销。可能会导致代码的可读性降低。7. class继承在ES6及以上的版本中JavaScript引入了class关键字用于定义类从而实现面向对象编程。class继承是一种通过类来实现继承的方式它使用extends关键字来指定父类并通过super关键字来调用父类的构造函数和方法。以下是一个使用class继承的示例代码classAnimal {constructor(type) {this.type type;}sayType() {console.log(I am a this.type);} }classDogextendsAnimal {constructor(type, name) {super(type);this.name name;}sayName() {console.log(My name is this.name);} }let dog newDog(canine, Fido); // 创建一个新的Dog对象dog.sayType(); // I am a canine dog.sayName(); // My name is Fido复制代码在上面的代码中我们首先定义了一个Animal类它包含一个构造函数和一个sayType()方法。然后我们通过extends关键字来指定Dog类的父类为Animal并在Dog类的构造函数中通过super关键字来调用Animal构造函数并实现了sayName()方法。最后我们创建一个新的Dog对象并调用它的方法来测试继承是否成功。优点代码可读性高更易于理解和维护。语法简洁可以更快地编写代码。可以使用现代JavaScript特性如箭头函数、解构赋值等。缺点与ES5及以下版本的JavaScript不兼容。需要编译才能运行在低版本浏览器中。某些开发者可能认为使用类和继承违背了JavaScript的本质。总体来说class继承是一种非常方便的继承方式特别是在面向对象编程中能够大大简化代码的编写和维护。但在一些特定情况下其他继承方式可能更为适合。大厂面试题分享 面试题库前后端面试题库 面试必备 推荐★★★★★地址前端面试题库
http://www.w-s-a.com/news/758189/

相关文章:

  • 上海 网站建设平台 补贴网站开发招标文件范本
  • 延安网站建设公司电话手机上那个网站做农产品推广比较好
  • 增城哪家网站建设好如何做网站实名认证
  • 常州地区做网站个人购物网站需要备案吗
  • 网站建设公司 跨界鱼科技专业做服务器的网站都有哪些
  • 欧洲网站服务器网站建设费用计入什么科目
  • 网站的色调苏州策划网站模板建站公司
  • 怎么看网站用的什么后台公路建设项目可行性研究报告编制办法哪个网站查最新版
  • 可以看的网站的浏览器有哪些专业APP客户端做网站
  • 如何做网站推广自己的产品推荐个网站好吗
  • 网站经营范围wordpress注入点
  • 学校网站开发协议夫妻网络网站建设
  • 福州网站seo推广优化微信商家小程序怎么弄
  • 免费网站推广工具在游戏网站做中介合法
  • 网站建设前的规划网站建设公司六安
  • 公司注册网站开发的行业表述南宁在百度上建网站
  • 创建企业网站国内网站用django做的
  • 云主机网站的空间在哪制作微网站的平台
  • 长沙做网站 青创互联wordpress4.4.1
  • 宜昌哪里有专业做网站的网站开发做什么的
  • 3小说网站开发东莞网站公司哪家好
  • 做网站安全联盟解ps网站设计概述
  • 聊城公司做网站wordpress连接域名
  • 宣传网站建设的意义台州行app官网下载
  • 温州 网站优化网站开发公司前置审批
  • 网站开发具体的工作内容网站下载app免费
  • seo网站建设时文章频率昆山网站建设ikelv
  • 中天建设中瑞物资网站优化建立生育支持政策体系
  • 网站页面的宽度大网站怎样选域名
  • icp网站备案流程wordpress post 405