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

时间:2015-05-07 06:02:47

标签: javascript prototype

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

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

var a = {flag : 1}

MDN中,我读到了

  

JavaScript中的所有对象都来自Object

但我找不到此对象的原型 a a.prototype给了我undefined

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

请帮助我理解这一点以及a.constructor

非常感谢任何帮助。

2 个答案:

答案 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))。