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.
任何帮助是极大的赞赏.
每个函数都可以作为构造函数调用(带new关键字)。
function Dog() {
this.legs = 4;
}
Run Code Online (Sandbox Code Playgroud)
当您将其作为普通函数调用时var dog = Dog(),它将window.legs在浏览器中定义为4(有点不同但在 Node.JS 中相关),并设置dog为undefined.
但是,如果您将其作为构造函数调用 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))。