安卓 on a null object reference_详解Object.prototype.__proto__

Object.prototype 的 __proto__ 属性是一个访问器属性(一个getter函数和一个setter函数), 暴露了通过它访问的对象的内部[[Prototype]] (一个对象或 null)。

使用__proto__是有争议的,也不鼓励使用它。因为它从来没有被包括在EcmaScript语言规范中,但是现代浏览器都实现了它。__proto__属性已在ECMAScript 6语言规范中标准化,用于确保Web浏览器的兼容性,因此它未来将被支持。它已被不推荐使用, 现在更推荐使用Object.getPrototypeOf/Reflect.getPrototypeOf 和Object.setPrototypeOf/Reflect.setPrototypeOf(尽管如此,设置对象的[[Prototype]]是一个缓慢的操作,如果性能是一个问题,应该避免)。

__proto__ 属性也可以在对象文字定义中使用对象[[Prototype]]来创建,作为Object.create()的一个替代。

ad4e9bc54b9c39393e45508c01a3f70b.png

语法:

let Circle = function () {};let shape = {};let circle = new Circle(); // 设置该对象的原型链引用// 过时且不推荐使用的。这里只是举个例子,尽量不要在生产环境中这样做。shape.__proto__ = circle;// 判断该对象的原型链引用是否属于circleconsole.log(shape.__proto__ === circle); // true
let shape = function () {};let p = {    a: function () {        console.log('aaa');    }};shape.prototype.__proto__ = p;let circle = new shape();circle.a();//aaaconsole.log(shape.prototype === circle.__proto__);//true//或者let shape = function () {};var p = {    a: function () {        console.log('a');    }};let circle = new shape();circle.__proto__ = p;circle.a(); //  aconsole.log(shape.prototype === circle.__proto__);//false//或者function test() {}test.prototype.myname = function () {    console.log('myname');}let a = new test()console.log(a.__proto__ === test.prototype);//truea.myname();//myname//或者let fn = function () {};fn.prototype.myname = function () {    console.log('myname');}let obj = {    __proto__: fn.prototype};obj.myname();//myname

注意:这是两个下划线,后面是五个字符的 “proto” ,后面再跟两个下划线。

1370ec812f45996ccc4329000ba48a4b.png

__proto__的读取器(getter)暴露了一个对象的内部 [[Prototype]] 。对于使用对象字面量创建的对象,这个值是 Object.prototype。对于使用数组字面量创建的对象,这个值是 Array.prototype。对于functions,这个值是Function.prototype。对于使用 new fun 创建的对象,其中fun是由js提供的内建构造器函数之一(Array, Boolean, Date, Number, Object, String 等等),这个值总是fun.prototype。对于用js定义的其他js构造器函数创建的对象,这个值就是该构造器函数的prototype属性。

__proto__ 的设置器(setter)允许对象的 [[Prototype]]被变更。前提是这个对象必须通过Object.isExtensible() 判断为是可扩展的,如果不可扩展,则会抛出一个 TypeError 错误。要变更的值必须是一个object或null,提供其它值将不起任何作用。

要理解原型如何被使用,请查看相关文章:Inheritance and the prototype chain。

.__proto__属性是Object.prototype 一个简单的访问器属性,其中包含了get(获取)和set(设置)的方法,任何一个__proto__的存取属性都继承于Object.prototype,但一个访问属性如果不是来源于Object.prototype就不拥有.__proto__属性,譬如一个元素设置了其他的.__proto__属性在Object.prototype之前,将会覆盖原有的Object.prototype。

为了更好的支持,建议只使用 Object.getPrototypeOf()。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值