JS原型、原型链和7种继承方法

继承、原型继承 摘要:本文通过家族传承的生动比喻,将编程中的继承概念通俗化讲解。父类比作父亲(拥有私有属性和共享方法),子类比作儿子(继承父类特性并新增专属内容)。重点解释了原型继承机制(原型链如族谱查找规则)和ES6 class继承(简化版家族继承),并给出"先找自己再翻族谱"等记忆口诀。文中还列举了常见误区及解决方法,最终总结出用生活场景理解继承的三大要点,使抽象编程概念变得形象易懂、便于记忆。 阅读详情

构造函数

                function Person(name,age){
                    this.name=name;
                    this.age=age;
                    this.sex='男';
                    return this;//每个函数都会有个默认return返回值属性,这里不写return意思就是默认返回值是this
                }
                var person = new Person('xiaoming'18);//创建一个实例对象
                var person2= new Person('xiaohong',16)//创建多个实例对象

大写字母开头一般都是构造函数:function Person(){}

new的过程:

        1.var person = new Person('a',123)=>将参数传进去,函数中的 this 会变成空对象

        2.this.name = name;this.age = age;this.sex= '男' 为赋值;return this 为实际的运行机制

        3.return 之后赋值给 person,person具备了 person.name = xiaoming、person.age = 18、person.sex= '男'

        4. 继续往下执行person2其属性值也是一样根据实参传递 

new总结: 

         1. 在构造函数中创建一个空对象

         2. 函数的this指向空对象,并且将这个对象的隐式原型(__proto__)指向构造函数的原型(prototype)

         3. 逐行执行代码

         4. 隐式返回这个对象

扩展知识:
        var o ={}=>var o = new Object()的语法糖    因为o的构造函数就是Object函数,在JS底层其实已经帮我们自动new(实例化)了一遍

        数组以及自定义函数也是一样的

        注意:

        所有原始数据类型(Number、String....)以及引用数据类型最终都是由Function衍生而来的,而Function是由JS引擎自带产生的
        而所有的构造函数原型的隐式原型都来源于Object构造函数原型,所以这就是我们常说的万物皆对象的原因

1.原型prototype


        (1)原型的定义:每个函数都有一个属性——prototype,在默认情况下,prototype的值就是一个普通的object对象(属性的集合),它有一个默认叫做constructor的属性,而constructor是用来指向这个函数本身(可以理解为函数的来源)。
        (2)原型的使用:当一个函数被用作构造函数来创建实例时,这个函数的prototype属性值会被作为原型赋值给所有对象实例(也就是设置 实例的__proto__属性),也就是说,所有实例的原型引用的是函数的prototype属性
        注意:
                1.prototype是函数(构造函数)的属性
                2.__proto__是对象的属性

Person.prototype.name = "man";//在Person构造函数的原型上创建一个name属性并赋值
Person.prototype.say = function(){//在Person构造函数的原型上创建一个say方法
    console.log("hello");
}
function Person(){}//创建一个构造函数
var person = new Person();//创建一个实例对象=>设置实例对象的__proto__属性(实例对象的原型链也就产生了)
console.log(person.name);// man
person.say();// hello

(3)consturctor 构造函数 

定义:此属性只有原型对象才有,它默认指回prototype属性所在的构造函数

2.隐式原型 __proto__

 定义:所有对象上都有的一个属性,叫做隐式原型,__proto__,它指向创建该对象的构造函数的原型(prototype) ,即fn._proto_ === Fn.prototype      

用法: 

  •       当访问一个对象的成员是,如果该对象中存在这个属性,直接使用
  •       如果该属性不存在对象中,沿着该对象的隐式原型去查询
var obj = {
    a:1,
    b:2
}
obj.__proto__.c = 123;//往obj隐式原型直接添加c属性并赋值
console.log(obj.c)//123

注意:
       1. 每个构造函数原型的隐式原型都指向Object.prototype,但是Object.prototype是一个特例——它的__proto__指向的是null,切记切记!!!(null其实就是JS给的一个出口值)

       2.Function.__proto__指向自身Function.prototype,因为上文提到所有构造函数都是由大的Function创建的,既然Function是函数,当然指向的是其本身了

下面我将上文总结一张图,便于知识的整体梳理:(图片来源于掘金网技术社区)

 f:代表自定义函数

 3.原型链 

定义:原型链即是隐式原型 。
              为什么说原型链就是隐式原型,相信看完上图结构你已经有所明白了!

              因为每个对象和原型都有隐式原型,对象的隐式原型指向创建该对象的构造函数的原型对象,而父的原型又指向父的父,这种原型层层连接起来的就构成了原型链。

其实原型链的介绍就是隐式原型的介绍,下面我将附上几张图供大家作为原型链总结的参照

 1.函数是通过Function创建的

2.每个函数都有原型对象

  3.普通对象都是通过new 函数创建的

4.隐式原型的指向 

 

5. 原型中的constructor指向函数本身

 

 6.一条原型链的全貌 

 

 

扩展知识:

  1. JavaScript中非常重要的两条链

  2. 原型链的查找属性是从下往上的过程,作用域链的查找是从上往下的过程

  3. 作用域链中找不到出现报错,原型链找不到不会报错,出现undefined

 4.原型的应用

  1.基础方法:w3c不推荐直接使用系统属性             

1.Object.getPrototypeOf(对象) 获取对象的隐式原型                

        注意:

               ○  对象.__proto__   

               ○  [[scopes]] 、 __proto__ 系统属性不能被直接调用

2.Object.prototype.isPrototypeOf(指定对象) 判断当前对象是否在指定的对象的原型链上

3.对象 instanceof 函数:用来判断函数的原型在不在对象的原型链上 

4.Object.Create(对象) :创建一个空对象,并且将对象的隐式原型修改为指定的参数

        注意:在创建一个对象时,可以修改隐式原型,但是不要修改为null

5.Object.prototype.hasOwnProperty(属性名):判断某个对象属性名是不是对象自身的

2.将伪数组转换为真数组

                ○  Array.isArray(伪数组)
                ○  Array.prototype.slice.call(伪数组)

 3.判断一个数组是不是真数组的常用方法

1.用 getPrototypeOf 方法获取对象的隐式原型

var obj={};
var arr=[];
console.log(Object.getPrototypeOf(obj)===Array.prototype)//false
console.log(Object.getPrototypeOf(arr)===Array.prototype)//true

2.用 constructor 方法通过对象的构造函数判断 

var obj = {};
var arr = [];
console.log(obj.constructor === Array)//false
console.log(arr.constructor === Array)//true

 3.用 instanceof 操作符方法

 var obj = {};
 var arr = [];
console.log(obj instanceof Array); // false
console.log(arr instanceof Array); // true

 4.用 Object.prototype.toString 方法来检测对象数据类型

var str = 123456;
//注意:原始类型是没有属性和方法的
//所有的数据在调用toString()时,调用的都是自身构造函数原型上的toString()
str.toString(); //'123456'
 
//所以必须去调用Object.prototype.toString()
console.log(Object.prototype.toString.call(123));//"[object Number]"
 
console.log(Object.prototype.toString.call(function(){}));//"[object Function]"
 
console.log(Object.prototype.toString.call(new Date()));//"[object Date]"
 
console.log(Object.prototype.toString.call([1,2,3]) === '[object Array]');//true

4.继承

        定义:不严格的说继承的本质就是复制,即重新创建一个原型对象,而新类型的实例继承了父原型里的所有属性。

在学习继承之前,其实还有一个原型链的问题没讲,而我们即将要学的继承就是去弥补原型链产生的问题的

原型链的问题       

 

问题一: 当原型链中包含引用类型值的原型时,该引用类型值会被所有实例对象所共享;

问题二: 在创建子类型(例如创建Son的实例)时,不能向超类型(例如Father)的构造函数中传递参数.

总结:所以在我们真正的实践中会很少单独使用原型链,都是运用以下几种继承方法来弥补原型链产生的不足之处。

1.原型链继承  

function A(){
  this.nums= ["1", "2", "3"];
}
function B(){}
 
//关键点在于此行代码,创建一个A的实例对象,并将该实例对象赋值给B.prototype
//也就是被创建的A对象将继承B原型上所有的属性
B.prototype = new A();
var instance1 = new B();
instance1.nums.push("4");
console.log((instance1.nums)); //"1,2,3,4"
 
var instance2 = new B(); 
console.log((instance2.nums)); //"1,2,3,4"
 

原型链继承存在的问题:      

问题一:当子类实现继承后,会继承超类型原型上所有的属性,也就是说超类型原型的引用类型属性会被所有的子类访问到,这样继承原型引用类型属性的子类之间就不再具有自己的私有属性了。

问题二:在创建子类型的实例时,没有办法在不影响所有对象实例的情况下给超类型的构造函数中传递参数。

2. 借用构造函数继承 

        为解决原型链中上述两个问题, 我们开始使用一种叫做借用构造函数。它是用来增强子类实例对象,等同于复制一遍超类(父类)的实例给子类。

function Father(){
    this.colors = ["red","blue","green"];
}
function Son(){
    Father.call(this);//继承了Father,且向超类型传递参数
    //扩展知识:如果有函数形参时可以用apply方法
    //Father.apply(this,arguments); arguments作为一个伪数组存储函数的每一个实参
}
var instance1 = new Son();
instance1.colors.push("black");
console.log(instance1.colors);//"red,blue,green,black"
 
var instance2 = new Son();
console.log(instance2.colors);//"red,blue,green" 可见引用类型值是独立的

核心代码是Father.call(this),创建子类实例时调用Father构造函数,于是Son的每个实例都会将Father中的属性复制一份。

缺点:      

  • 只能继承父类的实例属性和方法,不能继承原型属性/方法(因为超类型的原型中定义的方法对于子类型是独立不可访问的)
  • 因此每个方法都必须在构造函数中定义,所以无法实现函数复用,极度影响性能。

 3.组合继承 

        也叫伪经典继承,将原型链和借用构造函数的技术组合到一块。用原型链实现对原型属性和方法的继承,用借用构造函数技术来实现实例属性的继承。  

function Father(name){
    this.name=name;
    this.colors=['red','yellow','pink'];
}
Father.prototype.sayName=function(){
    alert(this.name);
};
function Son(name,age){
    Father.apply(this.arguments);//继承Father原型的实例属性,第一次调用Father()
    this.age=age;
};
Son.prototype=new Father();//继承父类原型的实例方法,第二次调用Father()
Son.prototype.sayAge = function(){
	alert(this.age);
};
var instance1 = new Son("xm",3);
instance1.colors.push("black");
console.log(instance1.colors);//"red,yellow,pink,black"
instance1.sayName();//xm
instance1.sayAge();//3
 
var instance1 = new Son("xh",10);
console.log(instance1.colors);//"red,yellow,pink"
instance1.sayName();//xh
instance1.sayAge();//10
 

组合继承避免了原型链继承和借用构造函数继承的缺点,且融合了它们的优点,也是JS中最常用的继承模式。而组合继承创建的对象也能够被instanceof和isPrototype()检测。

虽然组合继承是JS中最常用的继承方式,但是它也存在了一个缺点,就是在使用子类创建实例对象时无论什么情况下都会调用两次超类型的构造函数,并且创建的每个实例中都要屏蔽超类型对象的所有实例属性,造成了不必要的内存消耗。

下面即将要讲的圣杯式继承就有效的解决了此问题,成为了JS最理想的继承模式

4.传统继承——原型继承 

        在object()函数内部, 先创建一个临时性的构造函数, 然后将传入的对象作为这个构造函数的原型,最后返回了这个临时类型的一个新实例。(该方法这是由道格拉斯·克罗克福德所提出来的)

利用一个空对象作为中介,将某个对象直接赋值给空对象构造函数的原型。

function object(o){
	function F(){}
	F.prototype = o;
	return new F();
}

  而此方法返回值是一个引用传入对象的新实例,所以也就存在了某些数据被共享的问题

var Person = {
	colors : ["red","pink","blue"]
};
var PersonScd = Object(Person);//创建一个PersonScd实例对象,将Person原型上的所有属性赋值给它
PersonScd.colors.push("black");//往PersonScd的colors属性上添加一个值
var PersonTrd = Object(Person);
alert(Person.colors );//"red,pink,blue,black"

缺点:

  • 原型链继承多个实例的引用类型属性会被各个实例之间共享,且存在修改的可能。
  • 无法传递参数

另外,ES5中新增了Object.create()的方法,它能够有效代替传统继承方法。

5.寄生式继承  

其实就是在原型式继承得到对象的基础上,在内部再以某种方式来增强对象,然后返回构造函数。

function createPerson(original){
  var clone = Object(original); // 通过调用 object() 函数创建一个新对象
  clone.sayHi = function(){  // 以某种方式来增强对象
    alert("hi");
  };
  return clone; // 返回这个对象
}

函数的主要作用是为构造函数新增属性和方法,以增强函数

寄生式继承的缺点跟原型式继承一样

6. 寄生组合式继承(圣杯式继承) 

结合借用构造函数传递参数和寄生模式实现继承,因此圣杯模式成为了JS最理想的继承式方法

function inheritPrototype(subType,superType){
    var prototype = Object.create(superType.prototype);//创建对象,创建父类原型的一个副本
    prototype.constructor=subType;//增强对象,弥补因重写原型而失去的默认的constructor 属性
    subType.prototype=prototype;//指定对象,将新创建的对象赋值给子类的原型
}
 
// 父类初始化实例属性和原型属性
function SuperType(name){
  this.name = name;
  this.colors = ["red", "blue", "green"];
}
SuperType.prototype.sayName = function(){
  alert(this.name);
};
 
// 借用构造函数传递增强子类实例属性(支持传参和避免篡改)
function SubType(name, age){
  SuperType.apply(this, arguments);
  this.age = age;
}
 
// 将父类原型指向子类
//此行代码等同于组合继承写的 SubType.prototype = new SuperType()
inheritPrototype(SubType, SuperType);
 
// 新增子类原型属性
SubType.prototype.sayAge = function(){
  alert(this.age);
}

总结:圣杯式继承的核心在于只调用了一次SuperType构造函数,因此避免了在SubType.prototype 上创建不必要的、多余的属性。于此同时,原型链还能保持不变; 因此还能正常使用 instanceof 和 isPrototypeOf() 方法。

7. 混入方式继承多个对象   

function MyClass() {
     SuperClass.call(this);
     OtherSuperClass.call(this);
}
 
// 继承一个类
MyClass.prototype = Object.create(SuperClass.prototype);
// 混合其它
Object.assign(MyClass.prototype, OtherSuperClass.prototype);
// 重新指定constructor
MyClass.prototype.constructor = MyClass;
 
MyClass.prototype.myMethod = function() {
     // do something
};

总结:Object.assign会把 OtherSuperClass原型上的函数拷贝到 MyClass原型上,使 MyClass 的所有实例都可用 OtherSuperClass 的方法。

关于继承还有一个ES6——extends关键字方法,该方法主要用于类声明或者类表达式中,以创建一个类,该类是另一个类的子类。其中constructor表示构造函数,一个类中只能有一个构造函数,有多个会报出SyntaxError错误,如果没有显式指定构造方法,则会添加默认的 constructor方法。

JavaScript 对象 JavaScript 对象是 JavaScript 编程语言中一个非常重要的概念,它提供了灵活的数据存储和操作方式。本文介绍了对象的概念、创建方法、属性访问、方法调用以及一些高级特性。掌握 JavaScript 对象的相关知识,对于编写高效、可维护的 JavaScript 代码具有重要意义。 阅读详情

相关推荐

JS笔试题精讲2 面向对象、this专题

this 面向对象

m0_38066007的博客 381

【JavaScript】js中的原型继承

js中的原型继承

南栀的博客 3705

利用makehumancommunity导入人体模型到COMSOL里(需要solidwork)

#makehumancommunity #solidwork #COMSOL

qq_41227634的博客 2158

js原型继承

这是一道非常经典的前端面试题,尤其是对于初中级前端来说,基本上是必考题。

qq_38217940的博客 4567

别再手动算重量了!用C++给UG/NX写个自动计算零件质量与质心的插件(附完整源码)

本文详细介绍了如何使用C++为UG/NX开发智能质量分析插件,实现零件质量与质心的自动计算。通过结合NXOpen和UF_MODL API,设计高效的数据结构和批量处理机制,大幅提升机械设计效率。文章包含完整源码和实用技巧,帮助工程师告别手动计算,适用于复杂装配体的自动化工程计算。

weixin_30247307的博客 131

数字电子时钟——数字电路课设

本文设计了一种基于中小规模集成电路的数字电子时钟系统,采用模块化设计方法,包含晶振电路(CD4060+D触发器)、计时电路(74HC161计数器)、数码管驱动(CD4511)和整点报时功能。系统实现了60进制秒/分、24进制小时、7进制星期的计时显示,支持手动校时功能,并具备整点报时特性(59分54-58秒5次500Hz低音,59秒1次1000Hz高音)。通过分模块调试与整合,最终实物电路满足设计要求,获得优秀评价。

来自FZU——电子科学与技术专业 1489

5种JS原型继承方式总结,你了解几种?

js有几种经典的继承方式。比如原型链继承、构造函数继承、组合继承、寄生组合继承、ES6继承。让我们一一分析并实现。同时了解每种方案的优缺点。其实js的继承本质上是通过原型链机制实现的扩展。不管是哪种继承方式,都是通过操作父类原型链和子类原型链形成关联关系实现的。只是不同实现中需要考虑不同的问题。在实际项目开发中,建议尽可能使用ES6的class extends实现。其他实现方式主要是理解背后的原理和思想。

前端探索者 1205

虚幻引擎5 AR开发教程02:构建和测试AR Android App

在本教程中,我们将学习如何在虚幻引擎 5 上构建和测试 AR 安卓应用。

mopanchun的博客 2650

JS原型继承

今天要介绍的是,对象之间的”继承”的几种方式。 首先有一个问题,为什么继承还有几种方式呢?你看不管是java还是C++,继承就是继承,哪有几种继承方式,不过Javascript 是一种灵活的语言,之所以灵活,说不好听点就是设计得太简单,连基本的继承都要自己去实现,下面就说一下最常用...

zxl1578的博客 415

使用Python进行核磁数据预处理

随着医学与人工智能技术的快速崛起,伴随算法算力、数据等关键要素的积累和突破,人工智能技术在精准医学领域的科研应用也随之飞快增长,相关科研成果和学术论文数量逐年激增,医学影像人工智能涉及的技术如图像分割、病灶识别、病灶自动勾画、影像组学、深度学习模型构建和临床信息解析越来越趋于分析流程化,模块化,帮助越来越多的医生在临床科研实践中获得突破性的进展。根据具体的应用和数据类型,你可能需要调整或添加额外的步骤。对于更高级的处理,如图像分割或NMR数据的复杂处理,你可能需要查阅更专业的文献或使用更专业的软件工具。

xhlo521的博客 3132

移植Google Gemini Nano到RK3588 NPU,实现高效边缘推理

在嵌入式 AI 开发中,大家常常会遇到模型在硬件平台上运行时出现性能瓶颈的问题,比如推理速度慢、功耗过高,这严重影响了应用的实时性和稳定性 ,导致性能瓶颈,无法满足如智能安防、工业检测等场景的实时性需求。为了解决这些问题,我们可以将轻量模型移植到具有强大算力的硬件平台上。本文将手把手教你将 Google Gemini Nano(或类似轻量模型)移植到 RK3588 NPU,充分发挥 RK3588 NPU 的 6Tops 算力,实现高效的模型推理,提升嵌入式系统的 AI 处理能力。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 295

JavaScript:原型、原型链、继承

每个函数都有一个 prototype(原型)属性,这个属性是一个指针,指向一个对象, 而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法,使用原型对象的好处是可以 让所有对象实例共享它所包含的属性和方法。当你创建一个对象时,Javascript会从该对象的构造函数的原型对象中查找属性和方法。结合第四种中提及的继承方式,解决普通对象的继承问题的 Object.create 方法,我们在前面这几种继承方式的优缺点基础上进行改造,得出了寄生组合式的继承方式,这也是所有继承方式里面相对最优的继承方式。

snow的博客 1625

AIGC时代的必备技能:提示词工程(Prompt Engineering)全面指南

本文主要介绍了AIGC时代的重要技能——提示词工程(Prompt Engineering)。文章首先定义了提示词的概念,强调其作为人类与AI沟通桥梁的重要性,并详细阐述了提示词的功能特性,包括输入、大模型处理和输出三个环节。接着,文章探讨了提示工程的重要性,如提高输出质量、节省资源和时间等。随后,文章深入分析了提示词的基本构成要素,包括指令、上下文、输入数据和输出指示符,并提出了提示词的五大基本原则:清晰性与具体性、提供充足的上下文、明确任务与目标、考虑受众和迭代思维。最后,文章介绍了提示词的七大常见技巧

weixin_43178406的博客 27万+

JS原型、原型链和7种继承方法【白话文讲解】

前言 在学习JS原型、原型链和继承之前,我们必须先弄懂三个W,也就是我们常说的“学习三问” 学习三问: 1.它是什么?(What) 2.为什么用它?(Why) 3.什么时候用它?(When) 带着这三个问题去思考下面将要所学的知识,相信你一定会明白今后所学的每个知识点!! 友情提醒:学会某个知识点后一定要反复多敲几遍相关知识...

qq_60619943的博客 2673

NSIS教程(6): 使用第三方插件

NSIS内置了很多指令,这些指令可以满足我们基本需求,但难免会遇到NSIS没有内置的功能,如进程操作,后台运行(即多线程),7z压缩等等,这个时候我们就需要借助第三方插件来满足我们所需要的功能了。 一、插件获取 NSIS官方收录插件的网址是:http://nsis.sourceforge.net/Category:Plugins,我们可以在这个网站上查找和下载我们需要的插件,该网站上针对每

while(1) { smile(); } 9万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

javascript 7种继承-- new操作符的原理以及实现

new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。创建一个空的简单 JavaScript 对象(即 {}); 为步骤 1 新创建的对象添加属性 proto,将该属性链接至构造函数的原型对象; 将步骤 1 新创建的对象作为 this 的上下文; 如果该函数没有返回对象,则返回 this。new操作符的实现 手动写一个new操作符功能的函数new constructor[([arguments])]

Penk的博客 480

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

js继承es5、es6的7种方式

构造函数、原型对象 1.构造函数 function A(name) { this.name = name; this.arr = [1]; this.say = function(){ console.log('hi') } } 注意: 数组和方法都属于”实例引用属性“,但是数组强调私有、不共享的。方法需要复用、共享; 在构造函数中,一般很少有数组形式的引用属性,大部分情况都是:...

maggie_live的博客 405

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

proto文件支持继承吗_深入理解JavaScript之实现继承的7种方式

1.原型链继承核心:「将父类的实例作为子类的原型」首先,要知道构造函数、原型和实例之间的关系:构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个原型对象的指针。functionFather(){this.name='父类的名字'}Father.prototype.getFatherName=function(){console.log...

weixin_33584986的博客 392

深入理解JavaScript原型链机制

我来为您详细介绍JavaScript中的原型和原型链概念,并搜索一些合适的插图来帮助理解。现在让我搜索一些更详细的文字解释来补充说明:# JavaScript原型和原型链详解一、基本概念。

lmw6412036的博客 422

es6 ie不兼容 函数_web架构师 web前端面试100问之JavaScript(ES6/ES7)

1、什么是原型、原型链,有什么作用?答: 原型:每一个对象都与另一个对象相关联,那个关联的对象就称为原型。例如:函数Person有一个属性prototype,指向一个对象,对于普通函数来说没多意义,对于构造函数就有作用了,当使用new操作符时,会把Person.prototype(原型对象)赋值给实例的__proto__(原型实例)属性。JS有一个原型查找机制,把原来定义在实例上的方法,放到原型对...

weixin_32806343的博客 164

js 删除元素_前端开发--JS干货知识点, 请收藏吧!

总结的一些比较重要的知识点会持续更新的理解JavaScript面向对象编程面向对象的三大特点:继承、封装、多态JS中通过prototype实现原型继承JS对象可以通过对象冒充,实现多重继承Object类是所有Js类的基类通过function对对象进行封装通过使用arguments实现参数重载ES6语法糖可以直接定义类class,继承对象extends7个JavaScript数据类型1.基本数据类型...

weixin_39583623的博客 251

对于js的原型和原型链的理解

一、原型与原型链 JavaScript是一门基于原型的语言,在软件设计模式中,有一种模式叫做原型模式,JavaScript正是利用这种模式而被创建出来 原型模式是用于创建重复的对象,同时又能保证性能,这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。原型模式的目的是用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新...

浮生离梦的博客 4万+

JavaScript 继承百花齐放:从原型链到 ES6 类

继承,简单来讲就是让子类能够访问到父类的属性和方法,继承的主要作用就是实现代码的重用。在JavaScript中,主要通过原型链来实现继承。我们重温一下构造函数、原型和实例的关系:每个构造函数都有一个原型对象,原型有一个属性指回构造函数,而实例有一个指针指向原型。上篇文章中我们已经了解了原型和原型链的概念,本文就来介绍一下js中实现继承的几种方式。

~~~ 4755

带你理解JS原型和原型链

在与和我的后端朋友交流链表概念时,联想到了原型链。想到自己对原型链没什么了解,在参考一些文章和视频后(感谢网上的各位大佬!!!),带着自己的理解整理笔记如下,大家一起学习,最后还有原型链的应用场景引言大多面向对象的编程语言,比如java,都是通过类(class)实现对象的继承。JS的语言的继承不通过class,而是通过原型对象(prototype)实现,es6当中有类的继承,但是本质还是通过原型对象,为什么说继承可以减少资源的浪费呢,我们来看下面这个例子 可以看到,按照常理来说,不同实例对象的属性值不同

2302_80633106的博客 1641

原型和原型链

原型和原型链都是来源于对象而服务于对象的概念JavaScript的一切引用类型都是对象,对象就是属性的集合。

2302_77437037的博客 2048

JS 原型链

JS 原型链JS 原型链1. 原型和原型链的基础结论1.1 函数与对象的关系1.2 原型的类别1.3 原型和原型链1.4 JavaScript 里最顶层的两个概念1.5 instanceof2. 经典的原型和原型链的分析2.1 函数.prototype2.2 `对象.__proto__`2.3 函数.`__proto__`2.4 `函数.prototype.__proto__`2.5 `Object.__proto__`2.6 `Object.prototype.__proto__`2.7 `Functio

p1967914901的博客 4043
上一篇: 前端js实现本地模糊搜索
狗都不敲代码
博客等级 码龄4年 7粉丝 7原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值