成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

原型鏈、繼承 和 instanceof

hqman / 2419人閱讀

摘要:原型鏈繼承和參考理解的原型鏈和繼承實現(xiàn)了什么操作的過程發(fā)生了什么原型鏈和屬性原型鏈?zhǔn)鞘裁瓷厦娴氖鞘裁淳褪窃玩?,原型鏈?zhǔn)莾?nèi)部,指向它父類的。通過這一句說明的原型鏈就是指向函數(shù)的屬性。這可以為后面提到的繼承做準(zhǔn)備。

原型鏈、繼承 和 instanceof

參考:
MDN:instanceof
MDN:Inheritance and the prototype chain
理解JavaScript的原型鏈和繼承

new實現(xiàn)了什么操作

new的過程發(fā)生了什么?

function A(name){
  this.name = name
}
var a = new A("hehe")

 // var a = new A("hehe") =>
 var a = new Object();
 a.__proto__ = A.prototype; 
 A.call(a, "hehe");
原型鏈和prototype屬性 原型鏈?zhǔn)鞘裁?/b>

上面的 __proto__ 是什么?
就是原型鏈,原型鏈?zhǔn)莾?nèi)部 [ [Prototype ]],指向它“父類”的prototype。

打開瀏覽器控制臺,可以看到函數(shù)變量都有一個prototype屬性(箭頭函數(shù)沒有)。
通過這一句a.__proto__ = A.prototype; 說明a的原型鏈就是指向函數(shù)A的prototype屬性。

這里就有一個重要的認(rèn)識了,雖然名字很像,但是原型鏈并不是prototype屬性,同時原型鏈指向“父類”的prototype。幾乎所有對象都有原型鏈(除了null和undefined),通過__proto__ 可以看到原型鏈指向什么(當(dāng)然最好使用 Object.getPrototypeOf 取原型鏈)

通過實驗可以發(fā)現(xiàn),js中對象的鏈可以非常復(fù)雜。
一圖勝千言。這里借一張圖。

簡而言之

函數(shù)對象,F(xiàn)unction,Object,Array等等的原型鏈都指向Function.prototype

通過new操作符創(chuàng)建的對象原型鏈指向原來的函數(shù)的prototype屬性

Object.prototype屬性的原型鏈指向null(到null就停止了)

而Function.prototype(Array,Date,String等等),以及函數(shù)對象的prototype,原型鏈都指向Object.prototype

prototype屬性究竟是什么呢

可以看到是一個Object,有constructor和原型鏈。constructor是一個函數(shù),也就是函數(shù)自身。這可以為后面提到的繼承做準(zhǔn)備。

instanceof什么意思

The instanceof operator tests whether an object has in its prototype chain the prototype property of a constructor.

Syntax:
object instanceof constructor

意思就是object.__proto__===constructor.prototype

MDN的教程中舉例

// defining constructors
function C() {}
var o = new C();
// true, because: Object.getPrototypeOf(o) === C.prototype
o instanceof C;

但是

var simpleStr = "This is a simple string"; 
var myString  = new String();

simpleStr instanceof String; // returns false, checks the prototype chain, finds undefined

可是在瀏覽器中試驗Object.getPrototypeOf(simpleStr) === String.prototype
結(jié)果是true,大概這算作一個特殊情況

如何實現(xiàn)繼承

https://babeljs.io/repl/
可以在這個網(wǎng)站在線編譯并查看結(jié)果

class A{
  constructor(name) {
    this.name= name
  }
  toString() {
    return this.name
  }
}
class B extends A {
  toString(){
    return this.name + "b"
  }
}

編譯出來的ES5繼承

function _inherits(subClass, superClass) { 
    subClass.prototype.__proto__=superClass.prototype;
}
var A = (function () {
    function A(name) {
        this.name = name;
    }
    A.prototype.toString = function toString() {
        return this.name;
    };
    return A;
})();
var B = (function (_A) {
    function B() {
        if (_A != null) {
            _A.apply(this, arguments);
        }
    }
    _inherits(B, _A);
    B.prototype.toString = function toString() {
        return this.name + "b";
    };
    return B;
})(A);

簡單來說就是這樣

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/81705.html

相關(guān)文章

  • JavaScript系列--淺析原型繼承

    摘要:綜上所述有原型鏈繼承,構(gòu)造函數(shù)繼承經(jīng)典繼承,組合繼承,寄生繼承,寄生組合繼承五種方法,寄生組合式繼承,集寄生式繼承和組合繼承的優(yōu)點于一身是實現(xiàn)基于類型繼承的最有效方法。 一、前言 繼承是面向?qū)ο螅∣OP)語言中的一個最為人津津樂道的概念。許多面對對象(OOP)語言都支持兩種繼承方式::接口繼承 和 實現(xiàn)繼承 。 接口繼承只繼承方法簽名,而實現(xiàn)繼承則繼承實際的方法。由于js中方法沒有簽名...

    draveness 評論0 收藏0
  • 如何理解JavaScript的原型原型

    摘要:之前有朋友問怎么去理解原型和原型鏈的問題。理解原型鏈的小技巧將箭頭視作泛化子類到父類關(guān)系那么圖中所有的虛線將構(gòu)成一個繼承層級,而實線表示屬性引用。原型鏈?zhǔn)菍崿F(xiàn)繼承的重要方式,原型鏈的形成是真正是靠而非。 之前有朋友問怎么去理解原型和原型鏈的問題。這個問題,在面試中,很多同學(xué)經(jīng)常都會遇到。這里給大家講講,方便大家記憶。 JavaScript的特點JavaScript是一門直譯式腳本...

    xuexiangjys 評論0 收藏0
  • 如何理解JavaScript的原型原型?

    摘要:之前有朋友問怎么去理解原型和原型鏈的問題。理解原型鏈的小技巧將箭頭視作泛化子類到父類關(guān)系那么圖中所有的虛線將構(gòu)成一個繼承層級,而實線表示屬性引用。原型鏈?zhǔn)菍崿F(xiàn)繼承的重要方式,原型鏈的形成是真正是靠而非。 之前有朋友問怎么去理解原型和原型鏈的問題。這個問題,在面試中,很多同學(xué)經(jīng)常都會遇到。這里給大家講講,方便大家記憶。 JavaScript的特點JavaScript是一門直譯式腳本...

    adie 評論0 收藏0
  • JS中繼承方式總結(jié)

    摘要:三組合繼承結(jié)合原型鏈方式和借用構(gòu)造函數(shù)方式的有點,進行改進的一種繼承方式。四寄生組合式繼承為了解決組合繼承中子構(gòu)造函數(shù)的原型鏈出現(xiàn)冗余的屬性和方法,引入的一種繼承方式。 說在前面:為了使代碼更為簡潔方便理解, 本文中的代碼均將非核心實現(xiàn)部分的代碼移出。 一、原型鏈方式關(guān)于原型鏈,可點擊《深入淺出,JS原型鏈的工作原理》,本文不再重復(fù)敘述。 思路:讓子構(gòu)造函數(shù)的原型等于父構(gòu)造函數(shù)的實例...

    rottengeek 評論0 收藏0
  • 面向?qū)ο蟮男【啪?/b>

    摘要:由構(gòu)造函數(shù)返回的對象就是表達(dá)式的結(jié)果。如果構(gòu)造函數(shù)沒有顯式返回一個對象,則使用步驟創(chuàng)建的對象。運算符返回一個布爾值,表示對象是否為某個構(gòu)造函數(shù)的實例。 面向?qū)ο?本人能力有限,有誤請斧正 本文旨在復(fù)習(xí)面向?qū)ο?不包含es6) 本文學(xué)習(xí)思維 創(chuàng)建對象的方式,獲取對象屬性 構(gòu)造函數(shù),構(gòu)造函數(shù)的new 做了什么 原型與原型對象 原型鏈 繼承(借用構(gòu)造繼承、原型繼承、組合繼承、寄生組合繼承)...

    時飛 評論0 收藏0

發(fā)表評論

0條評論

hqman

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<