成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

JS中原型的理解

fxp / 2863人閱讀

摘要:我們都知道在的世界中,幾乎所有東西都是對象,而對象又是通過繼承來層層獲得屬性和方法,首先我們要區(qū)分對象和構(gòu)造函數(shù)的區(qū)別,中對象繼承的是對象,函數(shù)繼承的是函數(shù)雖然函數(shù)也是對象,只有函數(shù)才有原型屬性供它實例的對象繼承,也就是說在中顯示如下字符串

我們都知道在JS的世界中,幾乎所有東西都是對象,而對象又是通過繼承來層層獲得屬性和方法,

var str = new String("mario");
console.dir(str);

首先我們要區(qū)分String對象和function String(){}構(gòu)造函數(shù)的區(qū)別,JS中對象繼承__proto__的是對象,函數(shù)繼承__proto__的是函數(shù)(雖然函數(shù)也是對象),只有函數(shù)才有原型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指向的是 構(gòu)造函數(shù)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對象已經(jīng)是繼承的終點,所有的對象最終都會繼承于它。
我們在看看最初的String對象有個constructor屬性指向的是構(gòu)造函數(shù)function String(){};說明每個對象都有一個constructor屬性指向創(chuàng)建它的構(gòu)造函數(shù),所以字符串的constructor會指向String構(gòu)造函數(shù),那么問題是在JS中,函數(shù)也是對象,那么函數(shù)的作為對象時又是如何繼承的呢,
實際上所有的構(gòu)造函數(shù)都會繼承一個特殊的匿名函數(shù)f(){};這個特殊的匿名函數(shù)只有最基本的屬性和方法:

apply : ? apply()
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

這個特殊的匿名函數(shù)f,做為對象又繼承了終極對象Object,雖然函數(shù)也是對象,但是作為JS中的一等公民,他又有自己的特權(quán),匿名函數(shù)f又作為一等公民中的特殊存在,它又有什么特殊的屬性和方法呢,通過上面顯示的屬性和方法我們看到匿名函數(shù)f創(chuàng)建它的構(gòu)造函數(shù)是fuction Function(){};不要小看這個構(gòu)造函數(shù),它是特殊的匿名函數(shù)f以自己為原型和繼承自己的屬性創(chuàng)造的,就像女媧按照自己的樣子和能力,創(chuàng)造了第一個人類,其他的人類的原型都是這個人,這個人我們簡稱始祖吧,只有簡單的屬性和方法,

arguments :null
caller : null
length : 1
name : "Function"
prototype : ? ()
__proto__ : ? ()

幾乎就只有一個名字Function;而創(chuàng)造它的匿名函數(shù) f 就像是女媧;
可以這么說,所有的函數(shù)都繼承于這個特殊匿名函數(shù) f ,都有個原型,供它的實例對象繼承,而這個原型又繼承于終極的Object對象。

總結(jié):

JS里的所有對象分為兩類,一般對象,作為函數(shù)的對象;
一般對象首先繼承于創(chuàng)建它的原型對象,再繼承于終極Object對象,constructor屬性指向創(chuàng)建它的構(gòu)造函數(shù);當然作為終極Object對象,雖然沒有在繼承的對象,但是有創(chuàng)造他的構(gòu)造函數(shù)即constructor屬性,function Object(){};
函數(shù)繼承于特殊的匿名函數(shù) f ,還有個原型prototype即終極Object對象供它的實例對象繼承,而它的建造者就是已自身為原型和繼承的終極大BOSS function Function(){};

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/85087.html

相關(guān)文章

  • 理解js原型與繼承

    摘要:相當于在用原型繼承編寫復雜代碼前理解原型繼承模型十分重要。同時,還要清楚代碼中原型鏈的長度,并在必要時結(jié)束原型鏈,以避免可能存在的性能問題。 js是一門動態(tài)語言,js沒有類的概念,ES6 新增了class 關(guān)鍵字,但只是語法糖,JavaScript 仍舊是基于原型。 至于繼承,js的繼承與java這種傳統(tǒng)的繼承不一樣.js是基于原型鏈的繼承. 在javascript里面,每個對象都有一...

    wthee 評論0 收藏0
  • 面向?qū)ο?em>的 JavaScript

    摘要:是完全的面向?qū)ο笳Z言,它們通過類的形式組織函數(shù)和變量,使之不能脫離對象存在。而在基于原型的面向?qū)ο蠓绞街?,對象則是依靠構(gòu)造器利用原型構(gòu)造出來的。 JavaScript 函數(shù)式腳本語言特性以及其看似隨意的編寫風格,導致長期以來人們對這一門語言的誤解,即認為 JavaScript 不是一門面向?qū)ο蟮恼Z言,或者只是部分具備一些面向?qū)ο蟮奶卣?。本文將回歸面向?qū)ο蟊疽?,從對語言感悟的角度闡述為什...

    novo 評論0 收藏0
  • 你是否理解jsObject與Function與原型

    摘要:原型對象是由創(chuàng)建的,因此原型對象的構(gòu)造函數(shù)是構(gòu)造函數(shù)也可以是稱為對象,原型對象也就繼承了其生父構(gòu)造函數(shù)中的數(shù)據(jù),也同時繼承了原型對象的數(shù)據(jù)。當然這條原型鏈中的數(shù)據(jù),會被還是還是這類構(gòu)造函數(shù)繼承,但是不會被這些繼承,他們不處于同一個鏈條上。 js中,F(xiàn)unction的本質(zhì)是什么?Object的本質(zhì)又是什么?js中有幾條原型鏈? showImg(https://segmentfault.c...

    itvincent 評論0 收藏0
  • JS原型原型鏈深入理解

    摘要:如果要理清原型和原型鏈的關(guān)系,首先要明確一下幾個概念中的所有東西都是對象,函數(shù)也是對象而且是一種特殊的對象中所有的東西都由衍生而來即所有東西原型鏈的終點指向?qū)ο蠖加幸粋€隱藏的屬性,他指向創(chuàng)建它的構(gòu)造函數(shù)的原型,但是有一個例外,指向的是。 首先要搞明白幾個概念: 函數(shù)(function) 函數(shù)對象(function object) 本地對象(native object) 內(nèi)置對象(bu...

    Alex 評論0 收藏0
  • js深入(一)從原型理解原型

    摘要:構(gòu)造函數(shù)創(chuàng)建一個對象上邊這個例子,我們通過構(gòu)造函數(shù)創(chuàng)建了一個實例,從這個實例到他的原型到最后得,他們之間得關(guān)系,就形成了一個原型鏈和首先上邊這個例子里邊,我們聲明了一個構(gòu)造函數(shù),在后再這個構(gòu)造函數(shù)里邊有一個的屬性。 構(gòu)造函數(shù)創(chuàng)建一個對象 function Person() { } var person = new Person(); person.name = zhangsan; c...

    馬忠志 評論0 收藏0
  • 詳解js繼承(一)

    摘要:構(gòu)造函數(shù),實例構(gòu)造函數(shù),是用來創(chuàng)建對象的函數(shù),本質(zhì)上也是函數(shù)。這里剛好解釋一下時,說到的,可以通過實例的訪問構(gòu)造函數(shù),但是本質(zhì)上是原型對象的屬性。 前言 最近在學vue,到周末終于有空寫一些東西了(想想又能騙贊,就有點小激動?。?。在javascript基礎中,除了閉包之外,繼承也是一個難點。因為考慮到篇幅較長,所以打算分成兩個部分來寫。同樣基于《javascript高級程序設計》,做一...

    Object 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<