我們都知道在js的世界中,幾乎所有東西都是物件,而物件又是通過繼承來層層獲得屬性和方法,
var str = new string('mario');
console.dir(str);
首先我們要區分string物件和function string(){}建構函式的區別,js中物件繼承__proto__的是物件,函式繼承__proto__的是函式(雖然函式也是物件),只有函式才有原型prototype屬性供它例項的物件繼承,也就是說str.__proto__ === string.prototype;在chrome中顯示如下:
string
0: "m"
1: "a"
2: "r"
3: "i"
4: "o"
length: 5
__proto__: string
[[primitivevalue]]: "mario"
字串物件的長度是5,初始值是「mario" 繼承於string物件;這個string物件包含了我們熟知的大部分方法和屬性如:
charat(),charcodeat()..........,仔細看string物件的屬性和方法也包含乙個constructor和__proto__屬性,其中__proto__又指向object物件,constructor指向的是 建構函式function string(){};
__proto__指向的object物件包含以下屬性和方法:
constructor :ƒ object()
hasownproperty : ƒ hasownproperty()
isprototypeof : ƒ isprototypeof()
propertyisenumerable : ƒ propertyisenumerable()
tolocalestring : ƒ tolocalestring()
tostring : ƒ tostring()
valueof : ƒ valueof()
__definegetter__ : ƒ __definegetter__()
__definesetter__ : ƒ __definesetter__()
__lookupgetter__ : ƒ __lookupgetter__()
__lookupsetter__ : ƒ __lookupsetter__()
get __proto__ : ƒ __proto__()
set __proto__ : ƒ __proto__()
[[primitivevalue]] : ""
這個object物件沒有__proto__屬性,說明這個object物件已經是繼承的終點,所有的物件最終都會繼承於它。
我們在看看最初的string物件有個constructor屬性指向的是建構函式function string(){};說明每個物件都有乙個constructor屬性指向建立它的建構函式,所以字串的constructor會指向string建構函式,那麼問題是在js中,函式也是物件,那麼函式的作為物件時又是如何繼承的呢,
實際上所有的建構函式都會繼承乙個特殊的匿名函式f(){};這個特殊的匿名函式只有最基本的屬性和方法:
arguments : (...)
bind : ƒ bind()
call : ƒ call()
caller : (...)
constructor : ƒ function()
length : 0
name : ""
tostring : ƒ tostring()
symbol(symbol.hasinstance) : ƒ [symbol.hasinstance]()
get arguments : ƒ throwtypeerror()
set arguments : ƒ throwtypeerror()
get caller : ƒ throwtypeerror()
set caller : ƒ throwtypeerror()
__proto__ : object
這個特殊的匿名函式f,做為物件又繼承了終極物件object,雖然函式也是物件,但是作為js中的一等公民,他又有自己的特權,匿名函式f又作為一等公民中的特殊存在,它又有什麼特殊的屬性和方法呢,通過上面顯示的屬性和方法我們看到匿名函式f建立它的建構函式是fuction function(){};不要小看這個建構函式,它是特殊的匿名函式f以自己為原型和繼承自己的屬性創造的,就像女媧按照自己的樣子和能力,創造了第乙個人類,其他的人類的原型都是這個人,這個人我們簡稱始祖吧,只有簡單的屬性和方法,
arguments :null
caller : null
length : 1
name : "function"
prototype : ƒ ()
__proto__ : ƒ ()
幾乎就只有乙個名字function;而創造它的匿名函式 f 就像是女媧;
可以這麼說,所有的函式都繼承於這個特殊匿名函式 f ,都有個原型,供它的例項物件繼承,而這個原型又繼承於終極的object物件。
總結:js裡的所有物件分為兩類,一般物件,作為函式的物件;
一般物件首先繼承於建立它的原型物件,再繼承於終極object物件,constructor屬性指向建立它的建構函式;當然作為終極object物件,雖然沒有在繼承的物件,但是有創造他的建構函式即constructor屬性,function object(){};
函式繼承於特殊的匿名函式 f ,還有個原型prototype即終極object物件供它的例項物件繼承,而它的建造者就是已自身為原型和繼承的終極大boss function function(){};
js中原型鏈的理解
原型鏈是理解js物件導向很重要的一點,這裡主要涉及到兩個點,一是proto,二是prototype,舉個例子吧 例如 我用function建立乙個person類,然後用new person 建立乙個物件的例項,假如叫做pl,在person類的原型prototype新增乙個方法,例如 play方法,那...
js中原型和原型鏈
let hd new object object.prototype.show function function getname console.dir getname console.log getname.prototype.proto getname.proto proto true con...
js中原型物件詳解
我們先來了解一下,js使用原型物件的作用是什麼?回答 在使用自定義建構函式建立物件情況下,在例項化多個物件時,可能有很多方法或者屬性相同,比如乙個人的物件建構函式,那麼人都有會跑的方法一樣,都有10個拇指等等屬性,這個人物件的方法,你例項方法的時候都得一一建立記憶體空間,這樣太耗資源,那麼就需要乙個...