javascript 在 Object.create 的原型(prototype)参数中使用什么是 Object 与 Object.prototype

标签 javascript javascript-objects

我试图理解 Object 和 Object.prototype 之间的区别。因为要创建一个空对象,使用了 Object.prototype。我觉得为什么不反对。

我正在通过以下方式创建一个对象。

方法一:

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

对比

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

最佳答案

因为 Object 是一个用于构建对象的函数:

Object instanceof Function

所以你也可以这样做:

const o = new Object();

如果你阅读过更多关于 javascript 中的继承的内容,你就会知道使用 new 调用函数实际上会构建一个对象,该对象继承自构造函数 .prototype 属性和然后用 this 作为那个对象调用构造函数,所以上面一行等于:

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

如果你这样做

Object.create( Object )

您将创建一个继承构造函数的对象。我承认 Object 实际上是一个 function,它继承自 Function.prototype,而 Function.prototype 继承自 Object,这让我很困惑。原型(prototype) ...

关于javascript 在 Object.create 的原型(prototype)参数中使用什么是 Object 与 Object.prototype,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46863128/

相关文章:

javascript - 如何在对象数组中找到下一个将某个属性设置为 false 的对象?

对象

javascript - 谷歌地图拖尾事件未定义,而点击有效

javascript - 调用 karma 测试时未定义 Angular 错误

javascript - gtag.js 和 gtm.js 可以互换吗?

javascript - Chrome 重新排序对象键(如果是数字)是正常/预期的吗

javascript - 当引用在数组中时,如何从分层对象中获取值?

javascript - svg.js/svg-pan-zoom - 双击交互

javascript - Kendo UI 编辑器上传和缩略图 Url 事件

javascript - 实例变量在增量游戏的 javascript 类中无法正常工作