2-如果使用new Person()创建多个对象person1、person2、person3,则多个对象都会同时指向Person构造函数的原型对象。 0x03 JavaScript原型链污染 在看懂原型链的那几点内容后,其实就应该可以理解什么是原型链污染了,就是修改其构造函数的原型中的属性值,使其他通过该构造函数实例出的对象也具有该属性值。 可以看到我们修改成功了,新生成的 foo2 对象也具有hacker 属性,如果给foo1再往上加一个__proto__就可以修改(添加)Object的属性了。 那么在哪些情况下原型链会存在污染? 结果是,合并虽然成功了,但原型链没有被污染: ? 这是因为,我们用JavaScript创建o2的过程(let o2 = {a: 1, "__proto__": {b: 2}})中,__proto__已经代表o2的原型了,此时遍历o2的所有键名,你拿到的是
一、原型 ①所有引用类型都有一个__proto__(隐式原型)属性,属性值是一个普通的对象 ②所有函数都有一个prototype(原型)属性,属性值是一个普通的对象 ③所有引用类型的__proto __属性指向它构造函数的prototype var a = [1,2,3]; a. __proto__ === Array.prototype; // true 二、原型链 当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的__proto__隐式原型上查找 ,即它的构造函数的prototype,如果还没有找到就会再在构造函数的prototype的__proto__中查找,这样一层一层向上查找就会形成一个链式结构,我们称为原型链。 console.log(child.month); // Ann console.log(child.father); // undefined 在child中查找某个属性时,会执行下面步骤: 访问链路为
constructor属性指向构造函数本身(Person) 每个实例都有一个隐式原型(proto)指向构造函数的原型对象(Person.prototype) 每个原型对象也有隐式原型(proto) // Person.prototype: 2.png 图中浅紫色的都是自带的 function Person() { } function Car() { } Person.prototype.constructor 原型链 先扔一张图: 5.png Person.prototype. = new Son() 7.png 上图中红线表示的就是原型链了 Object.create() // Object.create(原型) var obj = {name: 'zhang',age // 2.beatTheMonster函数/方法执行了 // 3.bind(),保存了方法,并没有直接调用它
概念 原型 prototype 原型链 __proto__ [[Prototype]] 原型 思考一个问题 普通的对象或者数组上有原型吗?我们试一试 原型上是可以定义属性或者变量的。 () fn.prototype.fn2 = function(){ console.log('添加函数') } console.dir(fn.prototype) 那么原型有什么用呢 引出原型链 我们为Person()函数的原型上,添加变量name、age 和 方法 getAge() function Person(){ } Person.prototype.name 其实这就引出了原型链。这是在因为在原型链上离得较近。 原型链 原型链查找规则 从当前实例属性去查找,如果找到了就返回,否则顺着原型链一层一层的往上找。直到找到null为止。如果仍旧没找到就会报错。 __proto__ 我们再试一下,原型链上没有findd()方法。
导读: 分类:面试总结 题目:原型和原型链 基础很重要,时刻给自己充电! 1.题目 如何准确判断一个变量是数组 写一个原型链继承的例子 继承实现的其他方式 描述new一个对象的过程 zepto及其他源码中如何使用原型链 2.知识点 2.1 构造函数 特点:以大写字母开头 function )) { console.log(object[key]); } } 2.3 this this的几种使用场景 全局/函数 构造函数 对象 内部函数 call/apply 2.4 原型链 2.同时new两个对象时改变一个对象的原型中的引用类型的属性时,另一个对象的该属性也会修改。 2.调用inherits方法继承Stream原型中的属性。 3.扩展OutgoingMessage自身原型的函数。
prototype(原型):prototype是Function对象的一个属性,它定义了构造函数制造出的对象的公用祖先(属性和方法),可以继承该原型的属性和方法。原型也是对象。 __proto__(隐式原型):没个对象的__proto__属性指向自身构造函数的prototype。 constructor(构造器):返回对创建此对象的数组函数引用。 原型链基本概念:每个对象都会在其内部初始化一个属性,就是 proto,当我们访问一个对象的属性 时,如果这个对象内部不存在这个属性,那么他就会去proto里找这个属性,这个proto又会有自己的proto ,于是就这样 一直找下去,也就是我们平时所说的原型链的概念。 原型链--实现对象间的联系即继承的方法。
extends Animal { constructor (x, y, z) { super(x, y) this.z = z; } } const dog1 = new Dog(1, 2, Animal.apply(this, [x, y]); this.z = z; } Dog.prototype = new Animal(); const dog1 = new Dog(1, 2, 构造函数的 prototype 和实例对象的原型,其实是指向同一个对象的。 原型链 上面两节,我们搞清楚原型是什么,以及 构造函数 prototype 是什么了。那么原型链又是什么呢? 那么原型本身也是一个对象,如果查找属性或方法时,到原型还没找到呢,那么就去原型的原型继续找。 而javascript 运行环境中是预设了一些对象来作为原型的,如图: 查找属性或方法时,向上追溯,经过的原型,就形成了一条链,所谓原型链。 至于运行环境预设了哪些原型,已经他们的关系如何,为什么?
前言 我是歌谣 最好的种树是十年前 其次是现在 今天继续给大家带来的是原型和原型链的讲解 环境配置 npm init -y yarn add vite -D 修改page.json配置端口 { console.log(HandlePhone.prototype) var data=new HandlePhone("geyao",18) console.log(data,"dats is") 运行结果 案例2
,函数的prototype指向了一个对象,而这个对象正是调用构造函数时创建的实例的原型,也就是person1和person2的原型。 原型链 在JavaScript 中,每个对象通过__proto__属性指向它的原型对象,这个原型对象又有自己的原型,直到某个对象的原型为 null 为止,这种一级一级的链结构就称为原型链。 搜索会从原型链头开始,直到原型链的末端,寻找这个属性,这个例子中name属性就在对象本身找到的(person),而age是在原型中找到的(Person.prototype)。 扩展原型方法 var nums = new Array(1,2,3); /**添加一个返回数组的第一个元素的新方法。 总结 原型的存在是js的一个重点也是一个难点, 通过本篇,我们了解了原型与原型链,并且也介绍了一些原型常用的运用场景来加深我们对原型与原型链的理解。
原型链 这里只是通过一些案例补充之前对原型,原型链,instanceof的细节。 <! 使用Object构造器创建对象 var home = new Object() // 使用字面量形式创建一个数组arr var arr = [1, 2, 3] /** * prototype原型对象,即原型对象也是对象,是对象就可以通过原型链继承其原型上的属性和方法, * prototype是对象 ,所以prototype也可通过原型链继承其原型上的属性和方法 */ /** * 每个对象都可以通过原型链访问(或者说继承)其原型链上的属性和方法 * 使用构造函数创建的对象,可以通过原型链继承这个构造函数上的属性和方法(说白了就是这个构造函数的原型) * */ console.log(father.
根据定义null没有原型,并作为原型链的最后一个环节。 几乎所有JS中的对象都是位于原型链顶端的Object的实例 基于原型链的继承 ---- 继承属性 JS对象有一个指向原型对象的链。 当试图访问一个对象的属性时,还会搜索该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到找到一个名字匹配的属性或者到达原型链的末尾。 [[prototype]]是null // 这就是原型链的末尾,即null // 根据定义,null就是没有[[prototype]] // 综上,这个原型链如下: // {a:1, b:2}---> 是的,该属性值为2 // 原型上也有一个‘b’属性,但是它不会被访问到 // 这种情况叫做“属性遮蔽” console.log(o.c) // 4 // c是o的自身属性吗? --> null function f(){ return 2; } // 函数都继承自Function.prototype // 原型链如下 // f --> Function.prototype
前言 我是歌谣 最好的种树是十年前 其次是现在 今天继续给大家带来的是原型和原型链的深入讲解 环境配置 npm init -y yarn add vite -D 修改page.json配置端口 Student() console.log(student.pSkill) console.log(student.mSkill) console.log(student.tSkill) 运行结果 案列2
图解原型和原型链 原型和原型链是 JS 中不可避免需要碰到的知识点?,本文使用图片思维导图的形式缕一缕原型、原型链、实例、构造函数等等概念之间的关系? : 20190314143837.png 我们把注释删掉,给实例同名属性,可以看到打印出来的属性就指向这个: 20190314143944.png 原型链 原型同样也可以通过 __proto__ 访问到原型的原型 、原型的原型、原型的原型的原型直到 Object 构造函数为止。 这个搜索的过程形成的链状关系就是原型链 20190314144733.png 如下图: 20190314145239.png 看到 null 了么,原型链搜索搜到 null 为止,搜不到那访问的这个属性就是不存在的 : 20190314145540.png 以上,这就是原型、原型链、构造函数、实例、null 之间的关系。
= new Person(); p2.sayName()// CODER-V 这里,所有属性和方法都直接添加到了Person的prototype属性上,构造函数体中什么也没有。 但这样定义之后,实例任然可以拥有相应的属性和方法,要理解这个过程就必须理解ECMAScript中方原型的本质。 2. 这样就可以重写一个对象的原型继承关系: let biped = { numLegs: 2 }; let person = { name: "CODER-V" }; Object.setPrototypeOf (person,biped); console.log(person.biped);// 2,通过Object.setPrototypeOf为person的原型对象写入了新的值 但是不推荐这样做,因为修改了原型会间接修改了继承关系 为了避免使用setPrototypeOf()造成的性能下降,可以通过Object.create()来创建一个新的对象,同时为其指定原型: let biped = { numLegs: 2 }; let
原型与原型链 JavaScript有着七种基本类型String、Number、Boolean、Null、Undefined、Symbol、Object,前六种为基本数据类型,Object为引用类型。 function Student() {} Student.prototype = { from: "sdust" } var stu1 = new Student(); var stu2 = new Student(); console.log(stu1.from) // sdust console.log(stu2.from) // sdust __proto__ __proto__ 是原型链查询中实际用到的 原型链可以简单理解为将原型连成一条链,js每一次获取对象中的属性都是一次查询过程,如果在自有属性中找不到就会去原型对象中查找,如果原型对象中还查不到,就回去原型对象的原型中查找,也就是按照原型链查找, 直到查找到原型链的顶端,也就是Object的原型。
__proto__ => function(){} 由此可见,原型链记录了原型对象创建的整个过程,因此,我给原型链添加一个概念:原型链是原型对象创建过程的历史记录。 直到到达原型链的顶部仍然没有找到指定的属性,就会返回 undefined。 使用 for in 循环可以遍历对象所有的属性,包括该对象在原型链中的属性,如: var A = { a:1, b:2 }; var B = Object.create 注意在控制台中打印的顺序是 4 3 1 2,而不是 1 2 3 4。 所以最后的结果是 4 3 1 2。这就解释了原型链继承时查找属性的过程是先查找自身属性,当自身属性不存在时,会在原型链中逐级查找。
function Person() { } Person.prototype.name = 'Kevin'; var person1 = new Person(); var person2 = new Person(); console.log(person1.name) // Kevin console.log(person2.name) // Kevin 原型链(__proto__) 每一个JavaScript 原型和原型链 一张图搞懂: 函数与 Function 的关系 函数就是 Function 的实例. Object可以使用__proto__来访问对象的原型对象,即Object可通过__proto__访问Function的Function.prototype 原型继承的整个关系( 原型链 ) 可以知道所有的对象都有原型 Person.prototype.name = '张三' Person.prototype = { name: '王五' } console.log(person.name); //张三 案例2
详解原型与原型链 其实,刚开始学 JavaScript 时,就有学过原型与原型链的相关知识了,只是当时还没有养成写笔记的习惯,导致现在已经忘的七七八八了。 (因为 obj 自身是没有 constructor属性的,是通过原型链去它的原型上获取 constructor属性,所以覆盖该属性时,将不会再去原型链上查找) function Person(name) 实例对象在查找属性时,如果查找不到,就会沿着 __proto__去它的原型上查找,还找不到,则继续去原型的原型上查找,直到找到或到最顶层为止。这就是原型链的概念。 下面这张图就是原型链的简单图(找不到是在哪里截的图了,侵删) 原型链的作用 为对象设置默认值 利用原型为对象设置默认值。 __proto__ === Function.prototype); // true 经典原型链图 练手福利 题目来自JavaScript 之彻底理解原型与原型链 有加一道 function User
作者:冴羽 原文:github.com/mqyqingfeng/Blog/issues/2 构造函数创建对象 我们先使用构造函数创建一个对象: function Person() { } var person 但是你要注意: // prototype是函数才会有的属性 Person.prototype.name = 'name'; var person1 = new Person(); var person2 是这个函数的原型吗? 其实,函数的prototype属性指向了一个对象,这个对象正是调用该构造函数而创建的实例的原型,也就是这个例子中的person1和person2的原型。 那么什么是原型呢? 原型链 那Object.prototype的原型呢? null,嗯,就是null,所以查到Object.prototype就可以停止查找了 所以最后一张关系图就是 ? 顺便还要说一下,图中由相互关联的原型组成的链状结构就是原型链,也就是蓝色的这条线。
this.name); }; let person1 = new Person(); person1.sayName(); // "jackson" let person2 = new Person(); person2.sayName(); // "jackson" console.log(person1.sayName == person2.sayName 理解原型 在javascript中,无论何时只要创建一个函数,就会给这个函数函数创建一个特殊的属性叫作原型(prototype),在默认情况下,所有原型对象都会自动获得一个名为 constructor的属性 Person 的两个实例 person1 和 person2 都只有一个内部属性指回 Person.prototype,而且两者都与构造函数没有直接联系。 原型链 在通过对象访问属性时,会按照这个属性的名称开始搜索,如果它本身有的话,就直接返回该名称对于的值,如果它本身没有的话,就会向它的原型对象上找,找到之后也返回该名称对应的值。