我正在尝试理解JavaScript原型,我有点困惑。那里有大量的教程,每个都有不同的解释。所以我不知道从哪里开始。
到目前为止,我已经创建了一个简单的JavaScript对象
var a = {flag : 1}
在MDN中,我读到了
JavaScript中的所有对象都来自Object
但我找不到此对象的原型 a a.prototype
给了我undefined
然后我发现原型在a.constructor.prototype
中可用。当我创建一个函数var myfunc = function() {}
然后myfunc.prototype
可用时。因此,prototype属性可直接在函数上使用,而不是在对象上。
请帮助我理解这一点以及a.constructor
。
非常感谢任何帮助。
答案 0 :(得分:2)
您可以使用Object.getPrototypeOf()
来返回Object
。
要在浏览器devtools中查看此内容,请运行以下命令:
var a = {flag: 1};
console.dir(Object.getPrototypeOf(a));
答案 1 :(得分:1)
每个函数都可以作为构造函数调用(使用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
是 not Dog
函数的原型(只是其实例将获取的原型)。 prototype
在非函数上不可用的原因是因为非函数不能用作构造函数,所以它没有任何意义(因为它的唯一函数是复制到构造的实例对象& #39; __proto__
)。
示例中的对象仍然有原型,但不能直接访问;您可以在允许它的浏览器中使用hacky路由(a.__proto__
),也可以很好地询问浏览器(Object.getPrototypeOf(a)
)。