首页
学习
活动
专区
圈层
工具
发布

一张图带你搞懂Javascript原型链关系

__proto__ 因为Function他是个函数,函数又是一种特殊的对象(函数类对象,又叫函数对象)。所以作为对象身上特有的标志__proto__,在Function身上也有一个。...而自定义函数的原型也是一个对象,他虽然在函数一生下来就有了,但是他作为对象,也是Object函数对象构建的。因此自定义函数原型身上的__proto__指向Object的原型对象。...当我们在最低部的自定义对象身上寻找一个属性或方法找不到的时候,JS就会沿着这条原型链向上查找,若找到就返回,直到null还查不到就返回undefined。 ?...这些函数是定义在Object原型身上的,我们也能用Person.isPrototypeOf、obj.hasOwnProperty这样使用了。...:arguments、caller、以及这俩属性的getter和setter; 最后还有对象:__proto__指向他的构造函数原型(也就是Object.prototype) Object原型上都有什么

1.3K50
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    vue实战-深入响应式数据原理

    数据初始化_init在我们执行new Vue创建实例时,会调用如下构造函数,在该函数内部调用this._init(options)。import { initMixin } from "..../init.js";// 先创建一个Vue类,Vue就是一个构造函数(类) 通过new关键字进行实例化function Vue(options) { // 这里开始进行Vue初始化工作 this...._init(options);}// _init方法是挂载在Vue原型的方法,每一个new 实例可以调用, 由initMixin方法挂载// 将不同的操作拆分成不同的模块,导入后对Vue类做一些处理,此做法更利于维护..._data此处有个细节,vue组件data推荐使用函数,防止数据在组件之间共享,原因是如果你定义的data是个对象的话,那所有的组件实例的data都会引用这个对象,一个组件更改了data别的组件也会发生变化...尤大也做出了官方的解释:图片数组的观测数组元素添加或删除操作的观测通过创建一个以原生Array的原型为原型的新对象,为新对象添加数组的变异方法,将观察的对象的原型设置为这个新对象,被观察的对象调用数组方法时就会使用被重写后的方法

    68710

    JavaScript 类完整指南

    JavaScript 使用原型继承:每个对象都从其原型对象继承属性和方法。...在 JavaScript 中不存在 Java 或 Swift 等语言中所使用的作为创建对象 蓝图的传统类,原型继承仅处理对象。 原型继承可以模仿经典类的继承。...如果你没有为该类定义构造函数,则会创建一个默认的构造函数。默认构造函数是一个空函数,它不会修改实例。 同时,一个 JavaScript 类最多可以有一个构造函数。 3....3.3 公共静态字段 你还可以在类本身上定义字段:静态字段 。它有助于定义类常量或存储特定于类的信息。...结论 JavaScript 类用构造函数初始化实例,定义字段和方法。你甚至可以使用 static 关键字在类本身上附加字段和方法。

    1.2K20

    你需要知道的 JavaScript 类(class)的这些知识

    在Java或Swift等语言中使用的传统类作为创建对象的蓝图,在 JavaScript 中不存在,原型继承仅处理对象。 原型继承可以模拟经典类继承。...定义:类关键字 使用关键字class可以在 JS 中定义了一个类: class User { // 类的主体 } 上面的代码定义了一个User类。 大括号{}里面是类的主体。...3.3 公共静态字段 我们还可以在类本身上定义字段:静态字段。这有助于定义类常量或存储特定于该类的信息。...类和原型 必须说 JS 中的类语法在从原型继承中抽象方面做得很好。但是,类是在原型继承的基础上构建的。每个类都是一个函数,并在作为构造函数调用时创建一个实例。 以下两个代码段是等价的。...总结 JavaScript 类用构造函数初始化实例,定义字段和方法。甚至可以使用static关键字在类本身上附加字段和方法。

    1K10

    【kao 源码】聊聊 Koa 中的 context

    一来它身上委托了很多 request 和 response 的属性和方法。二来当需要传递用户自定义的数据的时候,它也能发挥其作用(通过 ctx.state 还可以加一个命名空间)。...return handleRequest; } createContext 可以看到,每次请求,我们都通过 Object.create 创建一个上下文信息,也就是 context,它的原型会指向 context.js...其实它的实现在该对象后面。其调用的是另外一个库——delegate[3]。它的作用是将 proto(也就是我们的 Context)的部分属性和函数委托给 response 和 request。...defineGetter 方法可以将一个函数绑定在当前对象的指定属性上,当那个属性的值被读取时,你所绑定的函数就会被调用。...所以当你访问 ctx.request.xxx 的时候,实际上是在访问 request 对象上的 setter 和 getter。response 也是同理。

    1.2K10

    JS面向对象的程序设计

    成年':'未成年');//成年       从上面可知,定义访问器属性时getter与setter函数不是必须的,并且,在定义getter与setter时不能指定属性的configurable...当然,可以在函数中定义一个getName = getName的引用,而getName函数在Person外定义,这样可以解决重复创建函数实例问题,但在效果上并没有起到封装的效果,如下所示: function...return this.name; }      3、原型模式      JS每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,它是所有通过new操作符使用函数创建的实例的原型对象...     基于以上分析,原型模式创建的对象实例,其属性是共享原型对象的;但也可以自己实例中再进行定义,在查找时,就不从原型对象获取,而是根据搜索原则,得到本实例的返回;简单来说,就是实例中属性会屏蔽原型对象中的属性...原型模式的缺点,它省略了为构造函数传递初始化参数,这在一定程序带来不便;另外,最主要是当对象的属性是引用类型时,它的值是不变的,总是引用同一个外部对象,所有实例对该对象的操作都会其它实例: function

    1.5K10

    jQuery框架漏洞全总结及开发建议

    严格控制输出 可以利用下面这些函数对出现xss漏洞的参数进行过滤 1、htmlspecialchars() 函数,用于转义处理在页面上显示的文本。...2、htmlentities() 函数,用于转义处理在页面上显示的文本。 3、strip_tags() 函数,过滤掉输入、输出里面的恶意标签。...7、自定义函数,在大多情况下,要使用一些常用的 html 标签,以美化页面显示,在这样的情况下,要采用白名单的方法使用合法的标签显示,过滤掉非法的字符。...prototype 定义了 JavaScript 对象的默认结构和默认值,因此在没有为对象赋值时应用程序也不会崩溃。...在这种情况下,访问 if 从句中的 isAdmin 属性将要求访问user对象原型链中的父对象,即 Object,它现在即被污染并且包含被值为 true的 isAdmin 属性。

    20.8K20

    面向 JavaScript 开发人员的 ECMAScript 6 指南(3):JavaScript 中的类

    得益于 new 关键词,它似乎在语法上类似于过去常常在 Java 或 C++ 中看到的语法。 事实上,JavaScript 不是基于类的环境,而是一个基于对象的环境。...当克隆一个对象时,会保持对其原型对象的隐式引用。 在基于对象的环境中工作有其优势,但在没有基于类的概念(比如属性和继承)的情况下能执行的操作上也存在局限。...现在有一个有趣的问题:如果对象本身上没有 firstName、lastName 和 age 的 getter 和 setter 函数,那么如何在没有严格的解释器能力的情况下解析类似 “ted.firstName...通常,toString() 方法会为您完成这项工作,但 obj 上没有定义该函数,事实上,它之上什么都没有定义。该代码不仅能运行,还会返回结果: 清单 8....当使用一个 getter 或 setter 时,该语言会尊重原型,代表 ted 实例本身来执行它。 Person 类上定义的所有方法均如此,您在我们添加新方法时就会看到: 清单 9.

    91140

    深入 JS 对象属性

    可以通过Object.isExtensible() 方法判断一个对象是否是可扩展的(是否可以在它上面添加新的属性)。...以下特性是属于访问器属性: [[Get]]:是一个函数,表示该属性的取值函数(getter),默认为undefined [[Set]]:是一个函数,表示该属性的存值函数(setter),默认为undefined...: Object.defineProperty(obj, propName, propDesc):该方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。...obj:要在其上定义属性的对象。 prop:要定义或修改的属性的名称。 descriptor:将被定义或修改的属性描述符。...如果没有指定为 undefined,则是要添加到新创建对象的可枚举属性(即其自身定义的属性,而不是其原型链上的枚举属性)对象的属性描述符以及相应的属性名称。

    10.9K50

    Vue(尚硅谷天禹老师)

    vm身上所有的属性 及 Vue原型身上所有的属性,在Vue模板中都可以直接使用 Vue中的数据代理 image.png 总结: Vue中的数据代理通过vm对象来代理data对象中属性的操作(读/写)...为每一个添加到vm上的属性,都指定一个getter/setter。 在getter/setter内部去操作(读/写)data中对应的属性。 事件处理 事件的基本用法 对象中,最终会在vm上 methods中配置的函数,==不要用箭头函数!...要显示的数据不存在,要通过计算得来。 2. 在computed对象中定义计算属性。 3. 在页面中使用{{方法名}}来显示计算的结果。 1. 7. 3 .监视属性-watch 1....,但只能处理一次 所有组件实例对象的原型对象的原型对象就是 Vue 的原型对象 1 ) 所有组件对象都能看到 Vue 原型对象上的属性和方法 2 ) Vue.prototype.bus=newVue(

    2K20

    每天3分钟,重学ES6-ES12(十九)Proxy-Reflect

    * 我们在定义某些属性的时候,初衷其实是定义普通的属性,但是后面我们强 行将它变成了数据属性描述符。...如果我们想要侦听某些具体的操作,那么就可以在handler中添加对应的捕捉器(Trap): * set和get分别对应的是函数类型; * set函数有四个参数: * target:目标对象...这是因为在早期的ECMA规范中没有考虑到这种对 对象本身 的操作如何设计会更加规范,所以将这些API放到了Object上面; 但是Object作为一个构造函数,这些操作实际上放到它身上并不合适; 另外还包含一些类似于...in、delete操作符,让JS看起来是会有一些奇怪的; 所以在ES6中新增了Reflect,让我们这些操作都集中到了Reflect对象上; 那么Object和Reflect对象之间的API关系,可以参考...(target, prototype) 设置对象原型的函数.

    36520

    Vue学习笔记①

    data的两种写法 (1).对象式 (2).函数式 在data对象里写方法可以将data:function(){}简写为data(){} 如何选择:目前哪种写法都可以,以后学习到组件时,data必须使用函数式...vm身上所有的属性 及 Vue原型上所有属性,在Vue模板中都可以直接使用。...MVVM在概念上是真正将页面与数据逻辑分离的模式,它把数据绑定工作放到一个JS里去实现,而这个JS文件的主要功能是完成数据的绑定,即把model绑定到UI的元素上。...为每一个添加到vm上的属性,都指定一个getter/setter。 ​ 在getter/setter内部去操作(读/写)data中对应的属性。...事件处理 ​ 事件的基本使用: 使用v-on:xxx 或 @xxx 绑定事件,其中xxx是事件名; 事件的回调需要配置在methods对象中,最终会在vm上; methods中配置的函数,

    1.4K10

    「源码级回答」大厂高频Vue面试题(上)

    Vue.js在默认情况下,每次触发某个数据的 setter 方法后,对应的 Watcher 对象其实会被 push 进一个队列 queue 中,在下一个 tick 的时候将这个队列 queue 全部拿出来...defineComputed定义在源码src/core/instance/state.js210 行。...这里有一个 sharedPropertyDefinition ,我们来看它的定义: // src/core/instance/state.js const sharedPropertyDefinition...所以 defineComputed 函数的作用就是定义 getter 和 setter ,并且在最后调用 Object.defineProperty 给计算属性添加 getter/setter ,当我们访问计算属性时就会触发这个...❝对于计算属性的 setter 来说,实际上是很少用到的,除非我们在使用 computed 的时候指定了 set 函数。

    93721

    这也许是你会遇到的Google Chrome Bug

    Getter/Setter 在 JavaScript 定义对象时,我们同时可以通过 [[Getter]]、[[Setter]] 来为属性绑定对应的执行函数。...当执行 obj.name = '19Qingfeng' 时,实际上是会调用 obj 上的名为 name 的 setter 函数,从而修改 obj 实例对象上的 _name 值。...如果 child 的原型链上存在一个 name 并且此时他是一个 setter 时,那么此时我们在实例上进行赋值操作时,原型上的同名 setter 会被调用,并且 name 属性并不会被添加到实例中,同时也不会对原型上的...首先,child 对象中本身并不存在 name 属性,但是它继承与 parent 对象。child 的原型上存在所谓的名为 name 的 getter 和 setter 。...当我们为实例上进行取值/赋值操作时,如果原型上存在同名的 Getter/Setter 并且实例本身不存在时,那么十几上是会触发最近原型上的 Getter/Setter 从而屏蔽本次实例上的操作。

    50810
    领券