安卓 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()的一個替代。
語法:
let Circle = function () {};let shape = {};let circle = new Circle(); // 設置該對象的原型鏈引用// 過時且不推薦使用的。這里只是舉個例子,盡量不要在生產環境中這樣做。shape.__proto__ = circle;// 判斷該對象的原型鏈引用是否屬于circleconsole.log(shape.__proto__ === circle); // truelet 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” ,后面再跟兩個下劃線。
__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()。
總結
以上是生活随笔為你收集整理的安卓 on a null object reference_详解Object.prototype.__proto__的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微pe工具箱系统安装教程(微pe工具箱安
- 下一篇: 实现了某一个接口的匿名类的例子_java