JS 原型与继承2

这篇具有很好参考价值的文章主要介绍了JS 原型与继承2。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

//***-、原型、原型链、构造函数 prototype、 proto_、constructor

function Foo(){this.a=1} var foo = new Foo();
Object.getPrototypeOf(foo);//访问对象原型 效果等同于,foo. proto ,只是更推荐使用 Es6的 Object.getPrototypeof()方式
// constructor是原型上的一个属性,指向的是构造函数,如果重写了原型,就需要给他定义一个 constructor让它指向构造函数,否则实例的 constructor就会指向object// 重写构造函数原型,需要手动设置 constructor 为当前构造函数 Foo.prototype = {
aa:1,
bb:function(){
console.log(20);
constructor:Foo //很有必要

//***二、继承
//<->、原型链继承 function Super() {
this.a = 11l;
this.b = [1,2,3,4];
Super.prototype.say = function () {
console.log(222);

function Sub({}
Sub.prototype == new Super();//实现:原型链继承

var subl = new sub(); var sub2 = new sub();
//实现的继承结果: subl -- Sub.prototype -- new Super() -- Super.prototype -- Object.prototype

//该方式存在问题(引用值共享问题): subl.b.push(5);
console.log(subl.b);//[1,2,3,4,5]
console.log(sub2.b) ;// [1,2,3,4,5] sub2的也被修改了

//<二>、构造函数继承 function Super() {
this.a =11l;
this.b = [1,2,3,4];
Super.prototype.say= function (){
console.log(222);}
function Sub(){
Super.call(this);//实现:构造函数继承

var subl = new sub); var sub2 = new sub();
//解决引用值共享问题 subl.b.push(5);
console.log(subl.b);//[1,2,3,4,5] console.log(sub2.b) ;// [1,2,3,4]
//该方法存在问题(没办法拿到原型上的方法say方法 )

//<三>、组合继承(伪经典继承)
//***伪经典的原因在于,Super()执行了2次 function Super() {
this.a = 111;
this.b = [1,2,3,4];

Super.prototype.say=function(() {
console.log(222);

function Sub(){
Super.call(this);//实现:构造函数继承
Sub.prototype == new Super();//实现:原型链继承
var subl = new Sub(); var sub2 = new sub();
/1 该方式,既能解决引用值共享问题,又能拿到Super.prototype上的其他方法
// 因为,创建实例前,先给Sub指定原型,这时候已经先 newSuper()执行了。此时sub原型上的this.b 就是 [1,2,3,4]
11 创建实例时,再去 new Sub()时,通过 Super.call(this),就会把前一步构造函数上所有this,b全部覆盖,此时虽然值相同,但是已经是两个不同的引用值了
subl.b.push(5);
console.log(subl.b);//[1,2,3,4,5] console.log(sub2.b);//[1,2,3,4]
//***<四>、寄生组合继承(经典继承) function Super() {
this.a = 11l;
this.b = [1,2,3,4];
Super.prototype.say = function(){
console.log(222);

function Sub(){
Super.call(this);//实现:构造函数继承 ----> 要解决引用值共享功能,所以必须要这样做

//Sub.prototype == new Super();//实现:原型链继承// 要点:通过 object.creat(),绕开new Super()
Sub.prototype =0bject.creat(Super.prototype);//返回一个对象,指定当前赋值对象的原型为传入的参数 //实现:原型链继承

/ 注意:Object.creat(),是Ess的方法,ES3不支持,会有兼容性问题,需要些兼容性方案
***Object.creat 的兼容性方案 if(!Object.creat) {
Object.creat = function(proto) {
function F() {};
F.prototype = proto; return new f();

var subl = new sub(); var sub2 = new sub();
subl.b.push(5);
console.log(subl.b);//[1,2,3,4,5] console.log(sub2.b) ;// [1,2,3,4]

// 寄生组合继承,依然存在的问题:
/ Sub.prototype-Object.creat(Super.prototype);此时重写了sub的原型,如果在这句执行之前,往sun原型中添加了其他原型方法,就会被覆盖导致不可用而报错

//***<五>、圣杯模式继承:

//***<六>、extends 关键字,直接实现继承(ES6解决方案): class Super() {}
class Sub() extends Super {}
//<七>、拷贝继承文章来源地址https://www.toymoban.com/news/detail-626712.html

到了这里,关于JS 原型与继承2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第2集丨JavaScript 中原型链(prototype chain)与继承

    对于使用过基于类的语言(如 Java 或 C++ )的开发者来说, JavaScript 实在是有些令人困惑—— JavaScript 是动态的且没有静态类型。一切都是对象(实例)或函数(构造函数),甚至函数本身也是 Function 构造函数的实例。即使是语法结构中的“类”也只是运行时的构造函数。

    2024年02月12日
    浏览(46)
  • 什么是JavaScript中的类(Class)和继承(Inheritance)?它们与原型链继承相比有哪些优缺点?

    JavaScript中的类(Class)和继承(Inheritance)是面向对象编程的重要概念。类是一种抽象的概念,它定义了一组属性和方法,并且这些属性和方法可以在同一组对象中重复使用。继承是类之间的层次关系,其中一个类继承了另一个类的属性和方法,从而能够共享其代码和行为。 在Ja

    2024年02月12日
    浏览(58)
  • web前端tips:js继承——原型链继承

    原型链继承是 JavaScript 中实现继承的一种方式,它通过使用原型来实现对象之间的继承关系。 在 JavaScript 中,每个对象都有一个原型(prototype),它是一个指向另一个对象的引用。当我们访问一个对象的属性时,如果该对象自身没有该属性,则会去它的原型上查找,如果原型

    2024年02月15日
    浏览(35)
  • SAP Fiori开发中的JavaScript基础知识15 - 原型,object,constructor,class,继承

    本文将介绍JavaScript中的核心概念 - 原型,并会介绍基于原型的应用场景object,constructor,class,继承。 本文会将这几个核心概念汇总在一篇博客中,因为这些概念是触类旁通的,希望对你有帮助。 在JavaScript中,几乎所有的东西都是对象,每个对象都有一个 特殊的内部属性

    2024年04月23日
    浏览(122)
  • 【JS 构造|原型|原型链|继承(圣杯模式)|ES6类语法】上篇

    ⌚️⌚️⌚️个人格言:时间是亳不留情的,它真使人在自己制造的镜子里照见自己的真相! 📖Git专栏:📑Git篇🔥🔥🔥 📖JavaScript专栏:📑js实用技巧篇,该专栏持续更新中🔥🔥🔥,目的是给大家分享一些常用实用技巧,同时巩固自己的基础,共同进步,欢迎前来交流👀

    2023年04月16日
    浏览(39)
  • 【JS 构造|原型|原型链|继承(圣杯模式)|ES6类语法】下篇

    ⌚️⌚️⌚️个人格言:时间是亳不留情的,它真使人在自己制造的镜子里照见自己的真相! 📖Git专栏:📑Git篇🔥🔥🔥 📖JavaScript专栏:📑js实用技巧篇,该专栏持续更新中🔥🔥🔥,目的是给大家分享一些常用实用技巧,同时巩固自己的基础,共同进步,欢迎前来交流👀

    2024年02月01日
    浏览(77)
  • JavaScript设计模式(一)——构造器模式、原型模式、类模式

    个人简介 👀 个人主页: 前端杂货铺 🙋‍♂️ 学习方向: 主攻前端方向,正逐渐往全干发展 📃 个人状态: 研发工程师,现效力于中国工业软件事业 🚀 人生格言: 积跬步至千里,积小流成江海 🥇 推荐学习:🍍前端面试宝典 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js🍒

    2024年02月11日
    浏览(45)
  • 【002JavaScript 类继承】基本继承、调用父类方法和混入模式等方面的知识。掌握类继承的概念和技巧,提升代码的灵活性和可维护性。

    在 JavaScript 中,类继承是实现代码复用和扩展的重要概念。通过继承,我们可以基于现有类创建新类,并继承父类的属性和方法。本文将详细介绍 JavaScript 类继承的各个方面和技巧。 使用 extends 可以实现基本的类继承。 } class Dog extends Animal { bark() { console.log( ${this.nam

    2024年02月08日
    浏览(61)
  • 手撕前端面试题【javascript~ 总成绩排名、子字符串频次统计、继承、判断斐波那契数组等】

    html页面的骨架,相当于人的骨头,只有骨头是不是看着有点瘆人,只有HTML也是如此。 css,相当于把骨架修饰起来,相当于人的皮肉。 js(javascripts),动起来,相当于人的血液,大脑等一切能使人动起来的器官或者其他的。 在刷题之前先介绍一下牛客。Leetcode有的刷题牛客都有,

    2024年01月15日
    浏览(45)
  • jQuery.js - 前端必备的Javascript库

    作者: WangMin 格言: 努力做好自己喜欢的每一件事 jQuery.js 是什么? jQuery是一个快速简洁、免费开源易用的JavaScript框架, 倡导写更少的代码,做更多的事情 。它封装JavaScript常用的功能代码,提供了一种简便的JavaScript设计模式,以及我们开发中常用到的操作DOM的API,优化HTML文

    2024年02月05日
    浏览(77)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包