簡體   English   中英

如何使用默認原型從沒有原型的對象創建JS對象?

[英]How to create a JS object with the default prototype from an object without a prototype?

背景:模塊查詢字符串例如能夠將key=value&hello=universe解析為對象{key: 'value', hello: 'universe'} 但是,模塊作者已決定返回的對象沒有原型。 換句話說,這個“混蛋”對象是由Object.create(null)創建的。

問題:使用parsed.hasOwnProperty('hello')會很方便,但如果沒有默認的對象原型,這是不可能的。 當然,人們可以使用Object.prototype.hasOwnProperty.call(parsed, 'hello')但我認為我們都同意這樣的表達是在出生后立即殺死丑陋的。

問題:如何很好地將無原型對象轉換為默認對象原型和hasOwnProperty等方法? 另外,這可以在不使用恐懼的 __proto__setPrototypeOf嗎?

使用parsed.hasOwnProperty('hello')會很方便,但如果沒有默認對象原型,這是不可能的

創建這樣一個“混蛋對象”的全部意義在於你不能這樣做 - 如果有人發送了一個查詢字符串?hasOwnProperty=oops到你的服務器怎么辦?

如何很好地轉換無原型對象以擁有默認對象原型和方法,如hasOwnProperty

別。 您應該使用帶有call的長格式,或者只使用完全符合您需要的in操作符

'hello' in parsed

在ES6的環境中,你也可能需要將對象轉換為正確的Map ,並使用它has方法。

我不建議更改第三方軟件包的原型,它可能會被凍結並容易出現運行時錯誤。 我既可以使用內置in操作者@Bergi建議或反映ES6 API。

 const _ = console.info const parsed = ( { __proto__: null , foo: 'fu' , bar: 'bra' } ) _('foo' in parsed) // true _('fu' in parsed) // false /** ES6 (fully supported in current browsers) */ _(Reflect.has(parsed, 'foo')) // true _(Reflect.has(parsed, 'fu')) // false 

我不能說我以前做過這個,但這是一種方法

 let bastard = Object.create(null); bastard.father = 'vader'; let adopted = Object.assign({}, bastard); console.log(adopted.hasOwnProperty('father')); // => true 

setPrototypeOf()是沒有什么可擔心的,但沒有它你可能會做如下;

 var o1 = Object.create(null), o2; o1.test = "42"; o2 = Object.assign({},o1); console.log(o2.test); console.log(o2.constructor.prototype); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM