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