JS中原型的理解

2021-09-16 12:43:49 字數 2865 閱讀 4790

我們都知道在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個拇指等等屬性,這個人物件的方法,你例項方法的時候都得一一建立記憶體空間,這樣太耗資源,那麼就需要乙個...