2017-10-21 79 views
4

J'essaie de comprendre la différence entre Object et Object.prototype. Car pour créer un objet vide, Object.prototype est utilisé. Je me sentais pourquoi pas Objet.javascript qu'est-ce que Object vs Object.prototype lorsqu'il est utilisé dans le paramètre proto de Object.create

Je crée un objet de la manière suivante.

Méthode 1:

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

est:

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

et

console.log(o) 
résultat

est

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__); 

résultat est:

function Object() { [native code] } 

et:

console.log(o) 

résultat est:

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> 

Dans ce général je trouve:

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

pourquoi ne pas

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

Parce que 'nouveau Object' équivaut à' Object.create (Object.prototype) '. Voilà comment cela fonctionne: la fonction constructeur qui initialise une instance n'est pas la même chose que l'objet dont les instances héritent. – Bergi

Répondre

1

cause Object est une fonction utilisée pour construire des objets:

Object instanceof Function 

Vous pouvez également faire:

const o = new Object(); 

Si vous avez lu plus sur héritage en javascript, vous savez que l'appel d'une fonction avec new un construit n fait un objet qui hérite de la fonction constructeur .prototype propriété et appelle le constructeur avec cette étant cet objet, de sorte que la ligne supérieure est égale à:

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

Si vous

Object.create(Object) 

vous va créer un objet qui hérite de la fonction constructeur. Et je reconnais que son assez déroutant que objet est en fait une fonction , qui hérite donc de Function.prototype qui hérite de Object.prototype ...

+0

'Objet est en fait une fonction qui hérite donc de Function.prototype qui hérite de Object.prototype' - Les deux objets sont identiques dans cette phrase. J'ai aussi essayé 'Fonction instanceof Object' il dit vrai. –

+0

@sanotsh oui cause * Fonction * est une * fonction * qui hérite * Function.prototype * qui hérite * Object.prototype * –