在Javascript中,为什么实例或对象文字没有“原型”属性?

时间:2015-06-30 07:20:13

标签: javascript oop functional-programming prototype prototype-programming

在Javascript中,任何“函数对象”都有一个原型

> F = function() {}
F()
> F.prototype
F {}

但“对象”或“实例”没有原型

> o = {}
Object {}
> o.prototype
undefined
> f = new F()
F {}
> f.prototype
undefined

但是,内置对象“Function”和“Object”有一个原型:

> Function.prototype
Empty()
> Object.prototype
Object {}

对我来说这看起来很混乱。

  1. Function和“function object”具有原型属性

  2. Object有一个prototype属性,但“object literal”和“instance object”没有原型属性

  3. prototype属性实际上意味着什么?在上面的示例中,prototype的{​​{1}}属性不应该是f吗?

    有没有人有关于如何解释这个的想法?谢谢!

1 个答案:

答案 0 :(得分:5)

不要将函数的prototype属性与对象的内部原型(将对象放在原型链中)混淆。

FunctionObject是构造函数,因此,它们有一个prototype属性,它将被指定为使用这些构造函数创建的对象的内部原型。

我推荐 Eloquent Javascript 的章节"The secret life of objects",特别是对于此引用:

  

重要的是要注意原型与构造函数关联的方式(通过其prototype属性)与对象具有原型的方式之间的区别(可以使用Object.getPrototypeOf)。构造函数的实际原型是Function.prototype,因为构造函数是函数。它的prototype 属性将是通过它创建的实例的原型,但不是它的自己的原型。