首页 > 其他分享 >原型与原型链

原型与原型链

时间:2023-03-19 13:12:33浏览次数:40  
标签:__ 函数 proto 对象 Object 原型 prototype

前提:javascript中的数据类型和判断方法:

数据类型

Boolean,Number,String是原始值boolean, number, string的包装类型,可以通过new创建对应的原始值

  • 值类型:undefined, number, string, boolean
  • 引用(对象)类型:函数(Function)、数组(Array)、对象(Object)、nullnew Number(10)(new构造器总是返回一个对象)等;

判断方法(整理过):

  • 值类型的类型判断用typeof;
  • 引用类型的类型判断用instanceof;

显式原型prototype

想必大家都听说过javascript里面一切皆对象,对象是属性的集合,对象(引用)类型中的函数(Function)是一种可执行的特别对象,数组(Array)是一种内部数据有序的、有数字下标的特殊对象。其中函数和数组跟对象的关系也不一样,数组可以看作对象的子集,函数和对象却不是包含的关系,函数是由对象创建的,而函数本身又是一种特殊的对象,由此我们引出prototype。

  • 每个函数都有一个属性叫做prototypeprototype的属性值是一个对象:
    • 这个对象中默认的只有一个叫做constructor的属性,属性指向这个函数本身(就是属性保存指向函数F 的一个引用);
    • 当然除了默认属性,还可以自定义添加很多属性,比如Object,它的prototype除了constructor之外还有我们熟悉的:
      • hasOwnProperty(function):
      • isPrototypeOf(function):
      • propertyIsEnumerable(function):
      • toLocaleString(function):
      • toString(function):
      • valueOf(function):
    • 以上是Object原生的prototype属性,方便开发我们还可以自己在prototype上定义一些属性,这就常用在项目中对Object的封装,比如:
      • Object.prototype.myName = 'javascripe'
      • Object.prototype.myFn = function () {//to do}

隐式原型__proto__

  • 每个对象都有一个隐藏的属性——__proto__,这个属性引用了创建这个对象的函数的prototype,即如果: let obj = new Object() // obj是对象 通过函数创建
    那么obj.__proto__ === Object.prototype;
  • 到这里问题又来了!Object.prototype不也是个对象吗,那么它也有__proto__,这个__proto__指向那里呢? Object.prototype的__proto__指向null 原因:
    • 回到最初说的javascript里面一切皆对象,所以对象Object就是最顶层的;
    • 为了打破函数和对象的这种复杂关系,Object的原型对象是原型链尽头,即console.log(Object.prototype.__proto__) // null
  • 同样的函数也是一种对象,函数的__proto__指向哪里呢?
    • 函数也是被创建出来的。所有函数都是Function的实例(包含Function,Function是被自身创建的)
    • 根据对象的__proto__指向的是创建它的函数的prototype就有
    Function.__proto__ === Function.prototype
    Object.__proto__ === Function.prototype
    Function.prototype.__proto__ ===Object.prototype
    

原型链:访问一个对象的属性时,先在基本属性中查找,如果没有,再沿着__proto__这条链向上找,这就是原型链。

标签:__,函数,proto,对象,Object,原型,prototype
From: https://www.cnblogs.com/rain111/p/17232863.html

相关文章

  • 前端开发:JS中原型和原型链的使用详解
    前言在前端开发过程中,涉及到JS原理相关的内容也就是常用的几大模块,不仅常用而且很重要,但是涉及到原理的话会有点难懂,尤其是对JS接触不太久的开发者来讲。本篇博文就来分享一......
  • Day04-设计模式之原型模式
    引例在介绍原型模式前,我们先从实际问题出发,对比解决方法前后优劣点。问题:现在有一只羊(包含属性:名字Dolly、年龄2),需要克隆10只属性完全相同的羊。1、一般解法1、定义Sh......
  • 原型模式(深浅克隆)
    浅克隆用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相司的新对象。结构原型模式包含如下角色:抽象原型类:规定了具体原型对象必须实现的的clone......
  • 单例bean与原型bean的区别
    在使用Spring开发时,Spring提供了五种scope,分别为singleton,prototype,request,session,globalsession。上图为各个scope描述的官方文档截图。Spring在一开始的时候只提供了s......
  • 【教学典型案例】22.原型图的面向对象
    目录​​一:背景介绍​​​​二:面向对象思想​​​​面向对象思想:​​​​三:分析过程​​​​1、颗粒封装、组合使用​​​​将所有页面中的公共内容抽取出来,封装成组件​​......
  • 创建型-原型模式
    定义 使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种对象创建型模式---百科。 通俗的说就是原型模式是一种创建型设计模式,指定某......
  • Spring设计模式——原型模式
    原型模式原型模式(PrototypePattern),是指原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。原型模式主要适用于以下场景:类初始化消耗资源较多使用new生......
  • vue生命周期以及如何将axios挂载到vue的原型链上
    生命周期组件的生命周期是指一个组件从创建->运行->销毁的整个阶段,强调的是一个时间段生命周期函数:是由vue框架提供的内置函数,会伴随着组件的生命周期,自动按次序执行 ......
  • JavaScript对象及面向对象基础(对象、构造函数、原型对象、继承、原型链、借用构造函数
    JavaScript是一种描述性语言,是一种基于对象和事件驱动的,具有安全性能的脚本语言。JavaScript语言是通过一种叫做“原型”的方式来实现面向对象编程的。一、对象(1)内置对象Str......
  • Book-深入设计模式-原型模式
    Book-深入设计模式-原型模式https://refactoringguru.cn/design-patterns/prototype原型模式亦称:克隆、Clone、Prototype原型模式是一种创建型设计模式,使你能够复制......