2017-10-21 61 views
4

我想了解對象和Object.prototype之間的區別。因爲要創建一個空對象,所以使用Object.prototype。我感覺爲什麼不是對象。javascript什麼是對象與Object.prototype當在Object.create的原始參數中使用

我正在用以下方法創建一個對象。

方法1:

o = Object.create(Object.prototype,{ p : {value: "test"} }); 
console.log(o.__proto__); 

結果是:

Object {__defineGetter__: function, __defineSetter__: function, hasOwnProperty: function, __lookupGetter__: function, __lookupSetter__: function…} 

console.log(o) 

結果是

Object {p: "test"} 
    p : "test" 
    __proto__ : Object 
     constructor : function Object() 
     hasOwnProperty : function hasOwnProperty() 
     isPrototypeOf : function isPrototypeOf() 
     propertyIsEnumerable : function propertyIsEnumerable() 
     toLocaleString : function toLocaleString() 
     toString : function toString() 
     valueOf : function valueOf() 
     __defineGetter__ : function __defineGetter__() 
     __defineSetter__ : function __defineSetter__() 
     __lookupGetter__ : function __lookupGetter__() 
     __lookupSetter__ : function __lookupSetter__() 
     get __proto__ : function __proto__() 
     set __proto__ : function __proto__() 

VS

o = Object.create(Object,{ p : {value: "test"} }); 
console.log(o.__proto__); 

結果是:

function Object() { [native code] } 

和:

console.log(o) 

結果是:

Function {p: "test"} 
    p : "test" 
    __proto__ : function Object() 
     arguments : null 
     assign : function assign() 
     caller : null 
     create : function create() 
     defineProperties : function defineProperties() 
     defineProperty : function defineProperty() 
     entries : function entries() 
     freeze : function freeze() 
     getOwnPropertyDescriptor : function getOwnPropertyDescriptor() 
     getOwnPropertyDescriptors : function getOwnPropertyDescriptors() 
     getOwnPropertyNames : function getOwnPropertyNames() 
     getOwnPropertySymbols : function getOwnPropertySymbols() 
     getPrototypeOf : function getPrototypeOf() 
     is : function is() 
     isExtensible : function isExtensible() 
     isFrozen : function isFrozen() 
     isSealed : function isSealed() 
     keys : function keys() 
     length : 1 
     name : "Object" 
     preventExtensions : function preventExtensions() 
     prototype : Object 
     seal : function seal() 
     setPrototypeOf : function setPrototypeOf() 
     values : function values() 
     __proto__ : function() 
     [[FunctionLocation]] : <unknown> 

一般我發現:

o = {}; 
// is equivalent to: 
o = Object.create(Object.prototype); 

爲什麼不

o = {}; 
// is equivalent to: 
o = Object.create(Object); 
+0

因爲'新Object'等同於'的Object.create(Object.prototype中)'。這就是它的工作原理 - 初始化實例的構造函數與實例繼承的對象不同。 – Bergi

回答

1

原因Object是用於構建對象的函數:

Object instanceof Function 

所以,你也可以這樣做:

const o = new Object(); 

如果您已經閱讀更多繼承javascript,你知道調用一個函數new a ctually建立起從構造函數.prototype財產繼承的對象,然後調用與構造是那個對象,所以上線等於:

const o = Object.create(Object.prototype); 
Object.call(o); 

如果你

Object.create(Object) 

你將創建一個繼承構造函數的對象。我承認它很困惑的是對象實際上是一個功能,因此從Function.prototype的Object.prototype中繼承繼承...

+0

'對象實際上是一個函數,因此繼承自繼承自Object.prototype'的Function.prototype - 兩個對象在這個句子中都是相同的。另外我試過'Function instanceof Object'它說的是真的。 –

+0

@sanotsh yes cause * Function *是一個*函數*,它繼承了* Function.prototype *,它繼承* Object.prototype * –

相關問題