所有javascript对象都有prototype还是仅仅函数对象有prototype?

http://blog.rainy.im/2015/07/...
说到并不是所有的对象都拥有prototype这一属性,只有函数有

但是看其他文章又说:
每个对象都有一个指向它的原型(prototype)对象的内部链接

到底所有javascript对象都有prototype还是仅仅函数对象有prototype?有啥区别?

阅读 13.7k
7 个回答

我们创建的每个函数都有一个 prototype(原型)属性,这个属性是一个指针,指向一个对象,
而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。

无论什么时候,只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性,这个属性指向函数的原型对象。在默认情况下,所有原型对象都会自动获得一个constructor(构造函数)属性,这个属性包含一个指向 prototype 属性所在函数的指针。

引自<<JavaScript 高级程序设计(第三版)>>中译本 第6.2.3节, 原型模式.

也就是JavaScript的prototype是仅函数拥有, 而对象也拥有prototype是源于其constructor属性所拥有的prototype.

[[prototype]]和prototype和__proto__

请注意!上面标题的第一个prototype外面有两层[]包裹![[prototype]] !== prototype
[[prototype]]是对象的私有属性,而prototype却是只有函数才有的属性!
__proto__是JS的非标准但许多浏览器实现的属性,即[[prototype]],也就是someObject.[[Prototype]] === someObject.__proto__,当然如果你在控制台操作的话会报错,因为浏览器并没有实现someObject.[[Prototype]]这样的操作,所以你如果非要验证的话请使用ES6支持的Object.getPrototypeOf()方法,即Object.getPrototypeOf(someObject) === someObject.__proto__

针对你问题的答案就是:所有javascript对象都有一个指向它的原型对象的内部链接[[prototype]],但只有函数对象才有prototype这个属性?

希望帮到你,欢迎追问

每个函数都有prototype,每个对象都有一个内部属性__proto__,其指向它原型对象。原型对象也是一个对象,所以也有__proto__

  • 每个对象都有__proto__ ( 除了 var obj = Object.create(null) )

  • 每个函数对象都有 prototype。这个属性用于实现“实例化”(函数对象也是对象所以也有__proto__,即 Func.__proto__ = Function.prototype)

  • 函数对象的 prototype 所指向的也是对象,所以也有 __proto__,即 Func.prototype.__proto__。这个属性用于实现“继承”

new(实例化):
var obj = new Func()
Func 函数对象的 prototype 赋值给 obj 对象的 _proto_
obj.__proto__ = Func.prototype
图片描述

extends (继承)
class Child extends Parent {}
Child 函数对象的 prototype 的 _proto_ 指向 Parent 函数对象的 prototype
Child.prototype.__proto__ = Parent.prototype

新手上路,请多包涵

个人测验:prototype属性并不是构造函数特有的,只要是函数就有,但是实例对象是不具有这个属性的,而__proto__这个属性,任何对象是不具有的,用xxx.hasOwnProperty('__proto__');结果:false;这个属性是Object.prototype具有的,其后的所有对象都是由此继承来的。

prototype属性是函数所特有,准确来说是构造函数所特有。每一个对象的__proto__指向其构造函数的prototype。详细你可以看下这篇文章

这个是都有的,这个是prototype是原型的意思,可以扩展很多方法,而且我们一般在面向对象设计时把习惯于把公有的方法和属性写在这里,有个原型链的概念是object.prototype._proto_=null时返回值是undefined

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题