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

Wis*_*hnu 6 javascript prototype

我试图理解JavaScript原型,我有点困惑.那里有大量的教程,每个都有不同的解释.所以我不知道从哪里开始.

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

var a = {flag : 1}
Run Code Online (Sandbox Code Playgroud)

MDN中,我读到了这一点

JavaScript中的所有对象都来自Object

但我无法找到原型此对象一个 a.prototype给我undefined

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

请帮助我理解这个以及它是什么a.constructor.

任何帮助是极大的赞赏.

Ama*_*dan 5

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

function Dog() {
  this.legs = 4;
}
Run Code Online (Sandbox Code Playgroud)

当您将其作为普通函数调用时var dog = Dog(),它将window.legs在浏览器中定义为4(有点不同但在 Node.JS 中相关),并设置dogundefined.

但是,如果您将其作为构造函数调用 as 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
Run Code Online (Sandbox Code Playgroud)

因此,dog.constructor.prototype严格来说,dog它不是 的原型,而是在构造函数运行时分配给原型的对象。尤其Dog.prototype没有原型的的Dog函数(只是原型,它的情况下,将收购)。prototype对非函数不可用的原因是因为非函数不能用作构造函数,所以拥有它是没有意义的(因为它唯一的函数是复制到构造的实例对象' __proto__)。

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