簡體   English   中英

如何處理沒有構造函數的JavaScript對象

[英]How to deal with JavaScript Objects which have no constructor

Node.js querystring.parse()方法返回看起來像是一個對象的東西,但是沒有構造函數的東西。 根據https://nodejs.org/api/querystring.html

“... querystring.parse()方法返回的對象不是原型繼承自JavaScript對象。這意味着沒有定義典型的Object方法,如obj.toString(),obj.hasOwnProperty()和其他方法,不管用。”

這容易導致錯誤,因為通常你會假設每個Object都理解一些基本方法,比如toString(),並且它有一個“構造函數”,或多或少地告訴我們它的“類型”。

處理這些相當無能為力的對象的最佳方法是什么? 我試過了:

let myOb =  new Object(dumbObject);

但是這會產生一個結果,它沒有toString() - 方法,也沒有屬性'constructor'。

將這些愚蠢的物體變成通常表現的物體的最佳方法是什么? 而且,為什么有人想要首先創建這樣的對象?

我想(從我的頭腦中)

let newObject = JSON.parse(JSON.stringify(dumbObject))

應該管用。

如果您想要一種更通用的方法來調用對象上的toString() ,可以使用Object.prototype .call()Object.prototype調用它。

var s = Object.prototype.toString.call(smartObject);

但為什么? 它只會在任何普通對象上給你"[object Object]" 為什么獲得該字符串很重要?

 var p = {}; var s = Object.create(null); console.log(p.toString()); console.log(Object.prototype.toString.call(s)); 

通常你會假設

不,你不會。 如果您做出這樣的假設,請在界面中記錄它們。

將這些愚蠢的物體變成通常表現的物體的最佳方法是什么?

Object.assign與普通對象一起用作目標。 或者,您也可以使用Object.setPrototypeOf更改原型,但不建議這樣做

或者只需創建所需的.toString.constructor等屬性。 這個例子

而且,為什么有人想要首先創建這樣的對象?

因為在使用對象而不是Map時需要這種安全性。 這個例子

使用Object#setPrototypeOf顯式設置啞對象的原型

var dumbObject = Object.create(null);
Object.setPrototypeOf(dumbObject, Object.prototype);
dumbObject.toString() //runs fine

感謝所有的答案,其中一個包含了另一個問題的鏈接,這個問題也是我的問題,即使我一開始並不知道。 另一個問題是: 如何使用默認原型從沒有原型的對象創建JS對象?

從中我找到了答案,我認為這是目前為止最簡單的解決方案:使用Object.assign()。 像這樣:

let orphan = require('querystring').parse("{}") ;
// console.log ( "Got value: " + orphan ) ;
// Above causes the error:
// -> TypeError: Cannot convert object to primitive value
let oa     =  (x) => Object.assign({}, x);
console.log ("Got value: " + oa (orphan) ) ;

請注意,問題不是特別關於“查詢字符串”,而是一般沒有原型的對象。 是的,我們應該把這些可憐的對象稱為“孤兒”而不是“愚蠢”。 但我認為“愚蠢”仍然是一個很好的術語。 沒有原型的對象很少(或沒有?)方法,所以如果有任何我們想問的問題它可以回答很少。

暫無
暫無

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

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