(1)prototype 是函数( function ) 的一个属性, 它指向函数的原型。
(2)__proto__ 是对象的内部属性, 它指向构造器的原型, 对象依赖它进行原型链查询,instanceof 也是依赖它来判断是否继承关系。
由上, prototype 只有函数才有, 其他(非函数)对象不具有该属性. 而 __proto__ 是对象的内部属性, 任何对象都拥有该属性.
prototype(显式原型)
Javascript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象,我们称之为 原型对象
。原型对象的所有属性和方法,都会被构造函数的实例继承。这意味着,我们可以把那些不变的属性和方法,直接定义在 原型对象
上。
注意:通过 Function.prototype.bind 方法构造出来的函数是个例外,它没有 prototype 属性。
作用:用来 实现基于原型的继承
与 属性的共享
。
|
|
__proto__(隐式原型)
JavaScript 中任意对象都有一个内置属性 __proto__
,在 ES5 之前没有标准的方法访问这个内置属性,但是大多数浏览器都支持通过 __proto__ 来访问。ES5中有了对于这个内置属性标准的 Get 方法即 getPrototypeOf() 。
注意:Object.prototype 这个对象是个例外,它的 __proto__ 值为 null 。
作用:构成原型链,同样用于 实现基于原型的继承
。举个例子,当我们访问 obj 这个对象中的 x 属性时,如果在 obj 中找不到,那么就会沿着 __proto__
依次查找。
两者之间的关系
(1)对象有属性 __proto__
,指向该对象的构造函数的原型对象。
(2)构造函数除了有属性 __proto__
,还有属性 prototype ,prototype 指向该构造函数的原型对象。
|
|