首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么重新分配__proto__会返回不同的结果?

重新分配proto会返回不同的结果是因为proto是JavaScript中的一个内置属性,用于指向对象的原型。当重新分配proto时,实际上是改变了对象的原型链。

在JavaScript中,每个对象都有一个原型(prototype),原型又可以是另一个对象的实例,形成原型链。原型链的作用是实现对象之间的继承关系,通过原型链,一个对象可以访问另一个对象的属性和方法。

当重新分配proto时,如果新的原型对象存在于原型链上,那么对象将继承新的原型对象的属性和方法。如果新的原型对象不在原型链上,那么对象将无法访问新的原型对象的属性和方法。

具体来说,重新分配proto会导致以下几种情况:

  1. 如果新的原型对象存在于原型链上,那么对象将继承新的原型对象的属性和方法。这意味着对象可以访问新的原型对象的属性和方法,并且可以通过原型链继续向上访问其他原型对象的属性和方法。
  2. 如果新的原型对象不在原型链上,那么对象将无法访问新的原型对象的属性和方法。这意味着对象只能访问原来原型对象的属性和方法,无法通过原型链访问新的原型对象或其他原型对象的属性和方法。

需要注意的是,重新分配proto是一种不推荐的操作,因为它会导致代码的可读性和可维护性变差。推荐的做法是使用Object.create()方法或者类的继承来创建对象,并通过原型链实现属性和方法的继承。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云云原生容器服务(TKE):https://cloud.tencent.com/product/tke
  • 腾讯云云数据库 MySQL 版(CDB):https://cloud.tencent.com/product/cdb
  • 腾讯云云存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网通信(IoT):https://cloud.tencent.com/product/iot
  • 腾讯云移动推送(TPNS):https://cloud.tencent.com/product/tpns
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

概率统计——为什么条件概率结果总和直觉不同

已知其中一个是女孩,那么另一个孩子也是女孩概率是多少呢? 这是一道概率论课本上经典问题,一开始时候,很多人觉得两个孩子性别是独立事件,我们知道其中一个孩子性别,应该对另一个孩子没有影响。...所以另一个孩子也是女孩概率是1/3。 这个答案计算过程没什么问题,我想大家应该都能看明白,但是不知道会有多少人觉得奇怪。为什么答案不是 1/2 呢?难道两个孩子性别不是独立吗?...还是之前题目里夫妻,还是那两个孩子(至少有一个是女孩)。不同是,假设有一天我们在公园碰见了这一对夫妻。不过,与此同时,夫妻还带了一个孩子。...我们之前一通分析,用上各种公式进行计算,得到结果明明是1/3,为什么这里就变成 1/2 了呢?这两道题难道不是一样吗?...这样理解都行得通,但还是没有解决我们之前疑惑,为什么看起来完全一样两件事,得到结果不同呢?就因为我们看到了其中一个孩子吗?可是我们看到孩子,与孩子性别的概率应该无关才对。

1.2K20

在Java中为什么不同返回类型不算方法重载?

doSomething } public void method(Integer id, String name) { // doSomething } } 为什么不同返回类型不算方法重载...从方法签名组成规则我们可以看出,方法返回类型不是方法签名组成部分,所以当同一个类中出现了多个方法名和参数相同,但返回值类型不同方法时,JVM 就没办法通过方法签名来判断到底要调用哪个方法了,如下图所示...: 那为什么返回类型不能做为方法签名一部分呢?...执行以上程序执行结果如下: 因此我们可以得出以下结论。 匹配原则1:精准类型匹配 方法重载优先调用和方法参数类型一模一样方法,这是第一优先匹配原则:精准类型匹配。...方法"); } } 以上程序执行结果如下图所示: 从上述执行结果可以看出,方法重载第四匹配原则是,依次向上匹配父类方法调用。

3.3K10

奇怪Java题:为什么128 == 128返回为false,而127 == 127返回为true?

奇怪Java题:为什么128 == 128返回为false,而127 == 127返回为true? 在回答这个问题之前,我们先来看看int和Integer对比,一步步揭开问题答案。...,其内存地址不同 (2) Integer变量和int变量比较时,只要两个变量值是相等,则结果为true。...Integer i = new Integer(100); int j = 100; System.out.print(i == j); //true 因为包装类Integer和基本数据类型int比较时,java自动拆包装为...int,然后进行比较,实际上就变为两个int变量比较 (3) 非new生成Integer变量和new Integer()生成变量比较时,结果为false。...而java API中对Integer类型valueOf定义如下,对于-128到127之间数,进行缓存,Integer i = 127时,会将127进行缓存,下次再写Integer j = 127

2.2K31

一篇文章让你搞懂原型和原型链

与多数面向对象开发语言有所不同,虽然JavaScript没有引入类似类概念(ES6已经引入了class语法糖),但它仍然能够大量使用对象,那么如何将所有对象联系起来就成了问题。...在 Object显式原型添加属性b,为什么 示例对象p 能使用此属性呢? p.b = b 2. 为什么 p.a 为undefined ? 如下图所示 1....__proto__.constructor 返回结果为构造函数Person 3. p.__proto__.__proto__ .constructor 返回结果为Object()函数 ?...__proto__ = Object.prototype 所以p.b打印结果为b,p没有b属性,一直通过__proto__向上查找,最后当查找到Object.prototype时找到,最后打印出b...,向上查找过程中,得到是Object.prototype,而不是Function.prototype,找不到a属性,所以结果为undefined,这就是 原型链,通过__proto__向上进行查找,最终到

82110

再解 JavaScript 原型 与原型链

针对这个结果,有以下疑问: obj 哪来 __proto__属性? 为什么添加到 __proto__属性,可以直接通过 obj 拿到?...第二个问题 对象与人不同是: 人不可以随便拿爸爸东西 而对象可以随便拿原型里东西 比如,当你向一个对象,索要一个属性时: 如果这个对象没有你要属性,它就会让它原型(爸爸)给你 如果它爸也没有,...__proto__ 中去找,直到找到 haha 属性或者 __proto__返回 null 为止。...关于 prototype 有这样一句话: 类是对象模板 你与我,都是人,“人”是类,是模板。 你与我,都属于“人”类,有很多共性: 有一张嘴 有两条腿 吃饭 睡觉 …… 这些共性是人类共有的。...当然,你与我做为独立对象,肯定也存在差异,比如:我名字叫 X,你名字叫 Y 。这些不同点,是对象“私有”

35300

JavaScript中isPrototypeOf函数详解

JavaScript中isPrototypeOf函数详解 有时看一些框架源码时候,碰到 isPrototypeOf() 这个函数,那么这个函数有什么作用呢?...isPrototypeOf() isPrototypeOf() 是 Object函数(类)一个方法,用于判断当前对象是否为另外一个对象原型,如果是就返回 true,否则就返回 false。...每一个对象也天生自带一个属性__proto__指向生成它函数对象prototype。 3. 函数对象prototype也有__proto__指向生成它函数对象prototype。...复制代码 为什么呢?...所以我理解,这两个表达意思是一致,就是写法不同,下面两个输出应该是一致: console.log(A instanceof B); console.log(B.prototype.isPrototypeOf

50440

js检查是否是数组

其他解决方案 数组是一个对象(typeof [] ===“object”),但与传统对象不同,它们有一个length属性(typeof({}).length ===“undefined”)。...这是规范中一个错误,一直回到JavaScript设计开始,关于这个介绍可以查看我这篇文章( typeof JavaScript基础:typeof null 为什么返回”object”)。...], [NaN], {__proto__: Array.prototype} ] 接下来我们再看一个例子,我们创造一个恶意修改像数组对象来达到通过测试目的,将对象__proto__改成数组Array.prototype...b[1] === b[5] // true Array.isArray(a) // false is_array(a)//true Array.isArray(b) // true 可以看到,我们写函数虽然返回了...我个人认为开发者应该鼓励用户使用新版浏览器,来避免产生一些不必要麻烦, 并且如果支持旧JS版本意味着支持旧浏览器意味着鼓励使用不安全软件也让用户面临软件带来安全风险。

3.4K71

这道JS经典面试题不要背,今天带你彻底搞懂它!

5. new Foo.getName() 乍一看以为是要考察 new 关键字 了,其实并没有,它还是考察了上面提到运算符优先级,根据优先级我们可以得出,Foo.getName() 是先执行,执行完只是输出了第一问结果...getName(),可你知道为什么会是这样吗?...__proto__ 指向构造函数 .prototype 将 this 指向新创建对象 返回新对象复习 原型链 知识点:每个函数实例对象都有一个 __proto__ 属性,__proto__ 指向了 ...prototype,当访问实例对象属性或方法,先从自身构造函数中查找,如果找不到就通过 __proto__ 去原型中查找。...() 在上一问可知实例最终访问 Foo 原型链上方法,最终为创建 new(Foo.prototype.getName()) 实例返回结果输出 3 。

45000

typeof和instanceof原理

了解更多可以看 《ES6 入门教程》 typeof null 为什么返回 'object',稍后会从JavaScript数据底层存储机制来解释。...typeof 原理 typeof原理:不同对象在底层都表示为二进制,在Javascript中二进制前(低)三位存储其类型信息。...每个构造函数都有一个原型对象 原型对象都包含一个指向构造函数指针 而实例都包含一个指向原型对象指针 那么,假如我们让原型对象等于另一个类型实例,结果怎么样?...Object.prototype是js原型链最顶端,它__proto__是null(有__proto__属性,但值是 null,因为这是原型链最顶端); 为什么要这么设计?...,返回值是什么,原理是什么 typeof null 为什么是 ”object“ 什么是原型,哪里是 [[prototype]] ”尽头“,为什么要这么设计 JavaScript原型链核心是什么 instanceof

2.4K41

深入JavaScript原型链污染

所有字符串都是String类一个实例 相比其他语言(如Java、python等传统OOP语言),JavaScript机制和类完全不同。...__func__)) # 输出:True 为什么id得到结果不相等?foo1.myName(通过实例去访问方法时),Python 实际上会创建一个绑定方法(bound method)对象。...不信我们将foo1打印出来看看(注意不同浏览器结果不一样) Prototype 属性 JavaScript 中 Prototype 是每个对象内部一个隐藏属性,它是对另一个对象引用,被称为这个对象...如果构造函数返回非空对象,则返回该对象,否则返回刚刚新创建对象。 返回新对象:如果构造函数没有显式返回一个对象,那么 new 表达式将返回新创建对象。...Object.create(constructor.prototype); // 执行构造函数 var result = constructor.apply(context, args); // 如果返回结果是对象

19010

手写 new 实现足够严谨吗?

简单地说,它会接受两个参数,第一个参数作为调用后返回对象 __proto__,第二个参数负责配置该对象相关属性。而这里第一个参数,可以是对象也可以是 null。...调用构造函数时候做了什么? 这时候,我们可能会想到,通过 new 调用构造函数时候,内部可能做了一些处理,导致最终返回实例对象 __proto__ 和我们预期不一致。...这两步检查构造函数原型对象类型,如果是一个对象,则会将其作为实例 __proto__;如果不是对象,则会将 Object.prototype 作为实例 __proto__。...可以看到,加入了对构造函数原型可能为 null 处理之后,返回实例 __proto__ 明确指向了 Object.prototype。...现在我们实现 new 就更加严谨了,而且也更接近原生 new 操作。 本文到这里就结束了。不过,从语言设计角度来说,为什么不将实例 __proto__ 也跟着设置为 null 呢?

50310

彻底弄懂JS原型与原型链

现在我们已经初步理解了原型和原型链,到现在大家明白为什么数组都可以使用push、slice等方法,函数可以使用call、bind等方法了吧,因为在它们原型链上找到了对应方法。...继承存在意义就是属性共享:好处有二:一是代码重用,字面意思;二是可扩展,不同对象可能继承相同属性,也可以定义只属于自己属性。...new后面调用一个空函数也返回一个对象,任何一个函数都可以当做构造函数。所以构造函数更合理理解应该是函数构造调用。...九、举一反三1. instanceof操作符平常我们判断一个变量类型会使用typeof运算符,但是引用类型并不适用,除了函数对象返回function外,其他都返回object。...__proto__, Constructor)}现在就可以解释一些比较令人费解结果了:fn instanceof Object //true// 1. fn.

1.1K40

掌握原型链,再炒冷饭系列

当我们对构造函数实例化时候,此时就会返回一个对象person,然而这个person对象就可以访问构造函数内部属性,以及原型上方法了。...这个person对象为什么可以访问构造函数属性?以及构造函数原型上方法?...1、创建了一个对象 2、将这个对象__proto__指向了构造函数prototype 3、执行构造函数内部方法,并改变构造函数内部this指向到新对象中 4、返回该构造函数结果 我们根据以上几点...[1]文章可以一同参考 总结 理解原型链,每一个函数都有一个原型prototype,每一个对象都有自己隐式__proto__,当我们访问对象属性时,优先在自己内部属性寻找,然后会找__proto_..._上属性,然后会去构造函数prototype上寻找,如果构造函数prototype找不到,会到到构造函数prototype__proto__上寻找,最后找不到该属性就返回undefined 了解

18210

彻底搞懂JS原型与原型链

现在我们已经初步理解了原型和原型链,到现在大家明白为什么数组都可以使用push、slice等方法,函数可以使用call、bind等方法了吧,因为在它们原型链上找到了对应方法。...继承存在意义就是属性共享:好处有二:一是代码重用,字面意思;二是可扩展,不同对象可能继承相同属性,也可以定义只属于自己属性。...new后面调用一个空函数也返回一个对象,任何一个函数都可以当做构造函数。所以构造函数更合理理解应该是函数构造调用。...九、举一反三1. instanceof操作符平常我们判断一个变量类型会使用typeof运算符,但是引用类型并不适用,除了函数对象返回function外,其他都返回object。...__proto__, Constructor)}现在就可以解释一些比较令人费解结果了:fn instanceof Object //true// 1. fn.

1.6K20

JS 原生方法原理探究(三):如何实现 new 操作符?

这两种情况下使用 new 操作符所进行操作有点点不同,这里拿带参数情况说明一下: 首先会对 Fn 这个 MemberExpression 求值,其结果是指向实际函数对象一个引用,我们把这个引用作为...]]方法,并将 argList 传入作为参数,返回调用结果 从这些描述可以看出,更多实现细节放在函数 [[Constructor]] 方法里。...将调用后得到结果作为 result 如果 result 是对象,则将其返回 否则,返回 obj 可以说,规范已经讲得很清楚了,简单地说,在 new 一个构造函数时候,具体会做下面的事情: 内部创建一个实例对象...,并指定实例对象原型: 如果构造函数原型是对象,则让实例 __proto__ 等于构造函数 prototype 如果构造函数原型不是对象,则让实例 __proto__ 等于 Object ...Fn 体现 为什么不直接使用 const instance = Object.create(Fn.prototype) 创建实例呢?

1K20

JavaScript 工厂函数 vs 构造函数

它像工厂一样,“生产”出来函数都是“标准件”(拥有同样属性) 构造函数 不同于其它主流编程语言,JavaScript构造函数并不是作为类一个特定方法存在;当任意一个普通函数用于创建一类对象时...3.png 他们是不同。 当我们使用工厂函数创建对象时,它__proto__指向Object.prototype,而当从构造函数创建对象时,它指向它构造函数原型对象。 那么这里发生了什么?...new 关键字进行如下操作: 创建一个空简单 JavaScript 对象 (即 {}) 链接该对象(即设置该对象构造函数)到另一个对象 将步骤1新创建对象作为 this 上下文 如果该函数没有返回对象...使用 new 运算符,正如我们所期待一样输出正确对象,但没有new运算符,结果是undefined 怎么可能呢?...因此,使用new运算符,JavaScript引擎将this 变量设置为引用新创建对象实例,这就是为什么我们可以看到传递给构造函数所有属性都已设置为 mike。

1K20

对Javascript 类、原型链、继承理解

,当调用Human()时候,它作为一个普通函数会被执行,输出create human here,但是没有返回值(即返回undefined);而当调用new Human()时,也输出create human...构造函数中多了一个参数并且函数体中多了一句this.name = name,这句话this指针指向new关键字返回实例化对象,所以根据构造函数参数不同,其生成对象中具有的属性name值也不同...这就是Javascript著名原型链结果啦。话不多说,先上图: ? 当我们访问person.name时,发生了什么呢?...这时,再次person.name就不会再寻找__proto__了,因为person本身已经具有了name属性,而且其值为joker,所以这里返回joker....不同,所以打印出来name值也不同

64810

面试官问:能否模拟实现JSnew操作符(高频考点)

附上之前写文章写过一段话:已经有很多模拟实现new操作符文章,为什么自己还要写一遍呢。学习就好比是座大山,人们沿着不同路登山,分享着自己看到风景。...例子1 控制台输出图 与new Object() 生成对象不同是new Student()生成对象中间还嵌套了一层__proto__,它constructor是Student这个函数。...结合这些小结,整理在一起就是: 创建了一个全新对象。 这个对象会被执行[[Prototype]](也就是__proto__)链接。 生成新对象绑定到函数调用this。...如果函数没有返回对象类型Object(包含Functoin, Array, Date, RegExg, Error),那么new表达式中函数调用自动返回这个新对象。...如果函数没有返回对象类型Object(包含Functoin, Array, Date, RegExg, Error),那么new表达式中函数调用自动返回这个新对象。

44920
领券