原型链的问题

FnaticE 2021-04-12 03:15:20
一样重新定向了原型链,咋的结果不同?

let p={};
p.__proto__=Array.prototype;
p.slice; //ƒ slice() { [native code] }。 结果正常


咋的这样就不行?
let o=Object.create(null);
o.__proto__=Array.prototype;
o.slice; //undefined.

...全文
116 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
泡泡鱼_ 2021-04-12
  • 打赏
  • 举报
回复
let o=Object.create(null); 你指定了o的原型对象是null。你可以看成是o继承了null。问题是null啥都没有,没有任何属性和方法,原型链上都找不到任何东东的,所以o也如此。这其实也就是为什么你o.slice未定义的原因。因为你是真的没给它定义。只是o.__proto__=Array.prototype;让你产生错觉,以为让o继承了Array,但其实,o.__proto__和你定义o.a,o.b,o.c没有任何不同。只是你恰好给个属性名称就叫:__proto__ Object.create(null)是最最干净的一个空对象,干净到啥都没有。就是一张白纸,你想画啥画啥。任何属性和方法均由自己去定义,不用担心覆盖原型链上的方法,因为它本身啥都没有。够自由奔放吧,它是干脆直接裸奔的 而
let p={};
相当于下面的,继承了object
let p=Object.create(Object.prototype)

let o = Object.create(null)
      o.__proto__ = Array.prototype

      const arr1 = new o.__proto__.constructor()

      console.log(o.__proto__ === [].__proto__) //=> true
      console.log(o.__proto__.constructor === [].__proto__.constructor) //=> true
      console.log(arr1.__proto__.constructor === [].__proto__.constructor) //=> true
      console.log(o.__proto__.slice === [].__proto__.slice) //=> true

      arr1.push(1)
      console.log(arr1) //=> [1]

      //如果上面的让你产生了错觉。认为o继承了Array
      //下面就是反证:只是你恰好给o添加了一个属性名称叫:__proto__
      //这就是为什么你o.slice报未定义的原因,因为o原本是啥属性和方法都没有的,你并没有给它定义slice方法,所以它未定义

      let o1 = Object.create(null)
      o1.prop = Array.prototype

      const arr2 = new o1.prop.constructor()

      console.log(o1.prop === [].__proto__) //=> true
      console.log(o1.prop.constructor === [].__proto__.constructor) //=> true
      console.log(arr2.__proto__.constructor === [].__proto__.constructor) //=> true
      console.log(o1.prop.slice === [].__proto__.slice) //=> true

      arr2.push(1)
      console.log(arr2) //=> [1]

FnaticE 2021-04-12
  • 打赏
  • 举报
回复
引用 2 楼 FnaticE 的回复:
甚至都没有[[prototype]]。。。
不对,应该是[[prototype]]是null。
FnaticE 2021-04-12
  • 打赏
  • 举报
回复
甚至都没有[[prototype]]。。。
Stephen_112 2021-04-12
  • 打赏
  • 举报
回复
{}跟Object.create(null)创建出来的对象时不相同的。后者是没有任何属性的。

87,997

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧