为什么原型在简单 JavaScript 对象中不可用

Why prototype is not available in simple JavaScript object

我正在尝试理解 JavaScript 原型,我有点担心 confused.There 那里有大量的教程,每个教程都有不同的解释。所以我不知道从哪里开始。

到目前为止,我已经创建了一个简单的 JavaScript 对象

var a = {flag : 1}

MDN,我读到

All objects in JavaScript are descended from Object

但是我找不到这个对象的原型 a a.prototype 给我 undefined

然后我发现原型在 a.constructor.prototype 中可用。当我创建一个函数时 var myfunc = function() {} 然后 myfunc.prototype 可用。因此原型 属性 可直接用于函数而不是对象。

请帮助我理解这个和那个是什么a.constructor

非常感谢任何帮助。

您可以使用 Object.getPrototypeOf() 代替 return 您是 Object 的原型。

要在您的浏览器开发工具中查看此内容,运行以下内容:

var a = {flag: 1};
console.dir(Object.getPrototypeOf(a));

每个函数都可以作为构造函数调用(使用 new 关键字)。

function Dog() {
  this.legs = 4;
}

当您将其作为普通函数调用时,var dog = Dog(),它将在浏览器中将 window.legs 定义为 4(如果在 Node.JS), 并将 dog 设置为 undefined.

但是,如果你调用它作为构造函数,如var dog = new Dog(),它会创建一个新对象,并将其constructor设置为这个函数,并将这个新对象赋值给dog.它将其内部原型(可以在某些浏览器中作为dog.__proto__访问)设置为构造函数的原型(Dog.prototype)。或者,在伪代码中,

var dog = {
  legs: 4
};
dog.constructor = Dog;
dog.__proto__ = Dog.prototype; // same as dog.constructor.prototype

因此,dog.constructor.prototype严格来说并不是dog的原型,而是构造函数为运行时将赋值给原型的对象。特别是,Dog.prototype 而不是 函数的 Dog 原型(只是其实例将获取的原型)。 prototype 在非函数上不可用的原因是因为非函数不能用作构造函数,所以拥有它是没有意义的(因为它的唯一功能是被复制到构造实例对象' __proto__).

你例子中的对象仍然有一个原型,但不能直接访问;你可以在允许它的浏览器中走 hacky 路线 (a.__proto__),或者很好地询问浏览器 (Object.getPrototypeOf(a))。