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

为什么在执行Object.create(null)之后将其原型设置为Object.prototype将不允许在Object.prototype中执行方法

在执行Object.create(null)之后将其原型设置为Object.prototype将不允许在Object.prototype中执行方法的原因是,Object.create(null)创建的对象是一个纯粹的空对象,它没有继承任何属性和方法,也没有原型链。因此,将其原型设置为Object.prototype后,该对象仍然不具备Object.prototype中定义的方法。

Object.prototype是JavaScript中所有对象的原型对象,它包含了一些常用的方法,比如toString()、valueOf()等。当我们在一个对象上调用方法时,JavaScript会先在该对象自身查找该方法,如果找不到,就会沿着原型链向上查找,直到找到该方法或者到达原型链的顶端。

然而,通过Object.create(null)创建的对象没有原型链,它不继承任何属性和方法,因此无法在Object.prototype中执行方法。如果将其原型设置为Object.prototype,虽然该对象会继承Object.prototype中的方法,但由于没有原型链,无法通过该对象直接调用这些方法。

这种情况下,可以考虑使用其他方式来执行方法,比如直接调用Object.prototype中的方法,或者将方法定义在该对象自身上。另外,也可以考虑使用其他对象创建方式,如字面量方式{}或者构造函数方式new Object(),这些方式会继承Object.prototype中的方法。

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

  • 云服务器(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 Lab):https://cloud.tencent.com/product/ailab
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

你的手写 new 实现足够严谨吗?

基本上,上面代码的实现没有什么问题,但是我突然产生了一个疑问:当第一个参数是 null 的时候,Fn.prototype = proto 已经把构造函数的原型对象设置 null了,为什么后面还要在判断第一个参数...null 之后设置 obj....这就能解释为什么null 重写构造函数的原型后,实例的 __proto__ 没有跟着改变了,因为调用构造函数的过程,它链接上了 Object.prototype,可以说,这里实例的原型链并没有断开...可以看到,加入了对构造函数原型可能为 null 的处理之后,返回的实例的 __proto__ 明确指向了 Object.prototype。...不过,从语言设计的角度来说,为什么不将实例的 __proto__ 也跟着设置 null 呢?这里不断开实例的原型链,而是将其链接到 Object.prototype 有什么好处?

49010

图解JavaScript对象原型原型

: 橙黄色实心代表函数,函数是可执行的对象; 橘红色圈圈代表prototype属性,且总是存在于函数对象; 蓝紫色带箭头线段代表原型链的走向; 蓝绿色实心代表普通对象 圈圈+实心组合形式的含义: 橘红色圈圈...+黄色实心代表prototype属性函数对象; 橘黄色圈圈+蓝绿色实心代表prototype属性普通对象; 图中,prototype属性就是可以被继承的原型原型可以是函数,也可以是普通对象,没有原型的对象为数不多...使用Object.create()创建的对象的原型却不一定是Object.prototype,这取决于传入的第一个参数,因为第一个参数是用来指定我们想要创建的对象的原型,除非第一个参数传入Object.prototype...``,显然这么做对Object.create()```这个方法属实大材小用了。...__proto__ === Object.prototype // true 为什么Function.prototype作为一个函数,它的原型不应该是Function.prototype自身吗,规范就是这么规定的

52020

深入理解继承

任何通过对象字面量定义的对象都有一个__proto__设置object.prototype,意味着它们都继承Object.prototype对象的属性,就像这个例子的book: var book...1.2.从Object.prototype中继承的方法 我们在前几天使用的一些方式实际上是定义Object.prototype原型对象,因此所有其他对象也都继承了这些方法。...这个对象自动继承自Object.prototype,并且属性默认被设置成可配置,可枚举,可写。第二个声明和第一个一样,但是显示使用了Object.create()方法。...当对象的属性被访问时,JavaScript会首先会在对象的属性搜索,如果没有找到,则继续__proto__指向的原型对象搜索。...原型链的末端结束于Object.prototypeObject.prototype对象的__proto__内部属性null

46740

这 6 点知识让我对 JavaScript 的对象有了更进一步的了解

创建具有特定原型的对象 protoRabbit充当所有兔子共享的属性的容器 单个兔子对象(如杀手兔子)包含仅适用于自身的属性(本例type),并从其原型派生共享属性 let protoRabbit...3.构造函数 — 构造函数原型 创建从某个共享原型派生的对象的更方便的方法是使用构造函数 JavaScript ,调用前面带有new关键字的函数会将其视为构造函数 构造函数将其this变量绑定到一个新对象...我们通过简单分配创建的所有属性都是可枚举的,Object.prototype的标准属性都是不可改变的,这就是为什么它们不出现在这样的for/in循环中的原因。...,该示例,hiddenNonsense map ,但在 for...in 不会显示。...现在,无论人们对Object.prototype做了什么,我们都可以安全地使用for/in循环 var map = Object.create(null); map["pizza"] = 0.069;

58620

彻底弄懂JS原型原型

图片可以看到obj上确实多了一个sayHello的属性,值一个函数,但是问题来了,obj上面并没有hasOwnProperty这个方法为什么我们可以调用呢?这就引出了 原型。...现在我们已经初步理解了原型原型链,到现在大家明白为什么数组都可以使用push、slice等方法,函数可以使用call、bind等方法了吧,因为它们的原型链上找到了对应的方法。...personAlet personA = new Person('张三')// personA的原型上添加一个方法,以供之后Person创建的对象所共享personA....如果想要生成一个平常字面量方法生成的对象,需要将其原型对象指向Object.prototype:let obj = Object.create(Object.prototype)// 等价于let obj...创建一个全新对象,并将其__proto__属性指向构造函数的prototype属性。将构造函数调用的this指向这个新对象,并执行构造函数。

1.1K40

彻底搞懂JS原型原型

图片可以看到obj上确实多了一个sayHello的属性,值一个函数,但是问题来了,obj上面并没有hasOwnProperty这个方法为什么我们可以调用呢?这就引出了 原型。...现在我们已经初步理解了原型原型链,到现在大家明白为什么数组都可以使用push、slice等方法,函数可以使用call、bind等方法了吧,因为它们的原型链上找到了对应的方法。...personAlet personA = new Person('张三')// personA的原型上添加一个方法,以供之后Person创建的对象所共享personA....如果想要生成一个平常字面量方法生成的对象,需要将其原型对象指向Object.prototype:let obj = Object.create(Object.prototype)// 等价于let obj...创建一个全新对象,并将其__proto__属性指向构造函数的prototype属性。将构造函数调用的this指向这个新对象,并执行构造函数。

1.4K20

JavaScript 设计模式学习第五篇-继承与原型

// 对象字面量形式,原型被隐式地设置 Object.prototype var rectangle = { sizeType: '四边形' } // Object.create() 创建,显示指定为...访问一个对象的时候,JavaScript 引擎会执行一个搜索过程,如果在对象实例上发现该属性,该属性值就会被使用,如果没有发现则搜索其原型对象 [[Prototype]],如果仍然没有发现,则继续搜索该原型对象的原型对象...[[Prototype]],直到继承链顶端,顶端通常是一个 Object.prototype,其 [[prototype]] null。...这就是原型链的查找过程。 可以通过 Object.create() 创建 [[Prototype]] null 的对象:var obj = Object.create(null)。...,缺点是方法都是构造函数定义,每次创建实例都会重新赋值一遍方法,即使方法的引用是一致的。

27710

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

简单翻译一下: 当通过可能为空的参数列表调用函数 F 的内部方法 [[Construct]] 的时候,会执行如下步骤: 让 obj 作为一个新创建的原生对象 按照规范指定的, obj 设置所有内部方法...将 obj 的内部属性 [[Class]] 设置 Object 传参 prototype 调用函数 F 的内部方法 [[Get]],获取函数的原型对象,作为 proto 如果 proto 是对象,则将...obj 的内部属性 [[Prototype]] 设置 proto 如果 proto 不是对象,则将 obj 的内部属性 [[Prototype]] 设置标准内建的 Object 的原型对象 调用函数...prototype 将实例对象绑定为构造函数的 this,此前传递进来的参数作为参数,并执行一遍构造函数 如果构造函数返回了对象,则将其作为返回值,否则将实例对象作为返回值 代码实现 ES3 版本的实现如下...根据规范,我们实现 new 的时候,需要检测构造函数的原型是不是对象,如果不是对象,比如说是 null,那么实例的 __proto__ 会指向 Object 的原型,而这里如果使用了 Object.create

99820

深入JavaScript原型链污染

这个对象将方法(在这个例子是 Foo.myName)和特定的实例(在这个例子是 foo1)绑定在一起。 实际上,像 Python 这样的面向对象语言中,方法并不是每个实例的独立副本。...这个原型对象本身也可能有它自己的原型,这样一层层向上直到一个对象的原型 null,形成一条原型链。这种机制使得对象可以继承其他对象的属性和方法。...由于所有的“普通”对象都“源于”(或者说把Prototype链的顶端设置)这个Object.prototype对象,所以它包含JavaScript许多通用的功能。...新对象可以访问构造函数原型上的属性和方法。 构造函数执行:构造函数(你 new 后面调用的函数)被执行。构造函数内部的 this 关键字会被指向新创建的对象。...JavaScript原型继承 从上一节可以看到,所有类对象实例化的时候将会拥有原型对象的属性和方法,这个特性被用来实现JavaScript的继承机制。

17210

原型

根据定义null没有原型,并作为原型链的最后一个环节。 几乎所有JS的对象都是位于原型链顶端的Object的实例 基于原型链的继承 ---- 继承属性 JS对象有一个指向原型对象的链。...[[prototype]]null,停止搜索 // 找不到d属性返回undefined 使用不同的方法来创建对象和生成原型链 ---- (1)使用语法结构创建的对象 var o = {a: 1}; /.../ o这个对象继承了Object.prototype上面的所有属性 // Object.prototype原型null // 原型链如下 // o -->Object.prototype -->null...--> Object.prototype --> null (2)使用构造器创建的对象 JS,构造器其实就是一个普通的函数,当使用new 操作符来调用这个函数时,他就可以被称为构造方法(构造函数...--> null var c = Object.create(b) // c --> b --> a -->Object.prototype --> null var d = Object.create

41220

javascript设计模式五:原型模式

js世界null类似道,nullObject.prototypeObject.prototype生各种对象,各种对象生万物。以下给出我珍藏已久的js万物图帮助理解记忆: ?...es5前,生成对象的原型只能达到Object.prototype,但es5出来后,js中新出个Object.create()方法可以创建以任意对象原型的对象了,换言之,最高我们可以创建以null原型对象的对象了...Object.create(null),其用处广泛,例如在Vue和Vuex的源码,作者都使用了Object.create(null)来初始化一个新对象,而非使用{}。...__protot__ === F.prototype); //true 总结一下,js,对象可以通过原型克隆来实现获取/继承原型对象的属性和方法,大多数情况下原型对象都是Object.prototype...,但有必要时,既可以通过Object.create()方法实现以任意对象原型的克隆操作,也可以通过修改构造器的prototype指向来借用其他对象的属性方法,这种思想其实是非常风骚的,但也非常危险,用时自己斟酌吧

29020

JS 原生方法原理探究(二):如何实现 Object.create

作为调用 new Object() 方法所创建的新对象 将 obj 的内部属性 [[prototype]] 设置 O 如果提供了第二个参数 Properties,且不是 undefined,则调用...我们实际上创建了一个很纯粹的空对象,这个对象的原型直接就是 nullObject.prototype 甚至没有出现在该对象的原型,这意味这个对象不会继承 Object 的任何方法。...__proto__ = proto 应该是一样的,为什么还要在这种情况下执行一遍 obj.__proto__ = proto 呢?...因此,这里新创建的实例的 __proto__ 还真不是 null。 但根据 Object.create 的实现规范,这里必须让实例的 __proto__ 指向 null,所以才需要执行 obj....__proto__ = proto 去手动设置对象原型。 当然,如果我们像第一个实现那样,直接去设置对象的 __proto__,而不是采用构造函数的方式,就不存在这个问题了。

1.8K21

Javascript 原型

原型对象也有一个自己的原型对象(__proto__),层层向上直到一个对象的原型对象 null。根据定义,null 没有原型,并作为这个原型的最后一个环节。...[[Prototype]] null,停止搜索 // 找不到 d 属性,返回 undefined使用不同的方法来创建对象和生成原型链使用语法结构创建的对象 2.JavaScript 对象有一个指向一个原型对象的链...是 Object.prototype 的属性 // 因此 o 继承了 Object.prototype 的 hasOwnProperty // Object.prototype原型 null /...包含 call, bind等方法) // 原型链如下: // f ---> Function.prototype ---> Object.prototype ---> null 使用构造器创建的对象...使用 Object.create 创建的对象 ECMAScript 5 引入了一个新方法Object.create()。可以调用这个方法来创建一个新对象。

55230

分享 15 个关于 JS 对象相关的基础知识

1.对象字面量是创建对象的最简单方式 创建对象的最简单方法是使用对象字面量。我们花括号 {} 定义了一组属性,用逗号分隔。下面是一个例子。...对象继承自其他对象 JavaScript ,对象继承自其他对象。对象有一个名为 __proto__ 的隐藏属性,指向它们的原型。所有对象都继承自全局 Object.prototype。...更改是在当前对象上完成的,而不是它的原型上 请记住,更改是在当前对象上完成的,而不是在其原型上。原型仅用于阅读。 添加、编辑或删除对当前对象执行的属性时。...以下示例的 delete 运算符不执行任何操作,它不会从原型删除 toString 属性。...我们可以创建没有原型的对象 Object.create(null) 创建一个没有原型的对象。 const obj = Object.create(null); console.log(obj.

82540

JS 对象的简单创建和继承

() 这个方法有两个参数,第一个参数是这个对象的原型,第二个参数用以对对象的属性进行进一步描述(可选) var obj = Object.create({x:1}); var obj1 = Object.create...Object的属性,并具有obj.x = 1 的属性值 但当参数null时,obj1则是一个没有原型的新对象,不会继承任何东西,甚至没有初始的toString()方法。...{ // 不能从null中继承 throw TypeError(); } if(Object.create){ //如果有这个方法就直接使用 return...){ // 不能从null中继承 throw TypeError(); } if(Object.create){ //如果有这个方法就直接使用 return...(q.x+q.y == q.z);//true 对象属性相关操作涉及到了原型链的规则 值得注意的是:它总是原始对象上创建属性或对已有的属性赋值,而不会去修改原型链;JS,只有查询属性时才会体会到继承的存在

2.8K20
领券