prototype
)函数的 prototype
属性(图)javascript
prototype
属性,它默认指向一个Object
空对象(即称为:原型对象)constructor
,它指向函数对象
给原型对象添加属性(通常都是添加方法)java
function
都有一个prototype
属性,即 显式原型__proto__
,可称为隐式原型 ===
其对应构造函数的显示原型的值总结:程序员
prototype
属性:在定义函数时自动添加的,默认值是一个空的Object
对象__proto__
属性:建立对象时自动添加的,默认值为构造函数的prototype
属性值ES6
以前)访问一个对象的属性时,面试
__proto__
这条链向上查找,找到返回undefined
var o1 = new Object()
函数
var o2 = {}
测试
下面这个图须要仔细理解。spa
instanceof
instanceof
是如何判断的?A instanceof B
B
函数的显式原型对象在A
对象的(隐式)原型链上,返回true
,不然返回false
Function
是经过new
本身产生的实例function Foo() { } var f1 = new Foo(); console.log(f1 instanceof Foo); // true console.log(f1 instanceof Object); // true
console.log(Object instanceof Function); // true console.log(Object instanceof Object); // true console.log(Function instanceof Function); // true console.log(Function instanceof Object); // true function Foo() {} console.log(Object instanceof Foo); // false
注意:Function
的显示原型和隐式原型是同样的。prototype
var A = function() { } A.prototype.n = 1 var b = new A() A.prototype = { n: 2, m: 3 } var c = new A() console.log(b.n, b.m, c.n, c.m) // 1 undefined 2 3
var F = function(){}; Object.prototype.a = function(){ console.log('a()') }; Function.prototype.b = function(){ console.log('b()') }; var f = new F(); f.a() // a() f.b() // 报错 f.b is not a function F.a() // a() F.b() // b()
对照下图理解:3d