<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 原型模式 原型模式(Prototype Pattern)是用于創建重復的對象,同時又能保證性能。這種類型的設計模式屬于創建型模式,它提供了一種創建對象的最佳方式。 這種模式是實現了一個原型接口,該接口用于創建當前對象的克隆。當直接創建對象的代價比較大時,則采用這種模式。 > 形象描述 [https://www.cnblogs.com/fengyumeng/p/10646487.html](https://www.cnblogs.com/fengyumeng/p/10646487.html) ## **new** 的過程 ``` # 原始 function Person(name) { this.name = name } new Person('張三') # 普通函數 - 類比過程 objectFactory(Person, '張三') var objectFactory = function() { // 從Object.prototype上克隆一個空對象 var obj = new Object() // 取得外部傳入的構造器,在此是Person var Constructor = [].shift.call( arguments ) // 指向正確的原型 obj.__proto__ = Constructor.prototype // 借用構造函數給obj設置屬性 var ret = Constructor.apply(obj, arguments) return typeof ret === 'object' ? ret : obj } ```` ### `prototype` **只要創建了一個新函數,就會根據一組特定的規則為該函數創建一個`prototype`屬性**,這個**屬性**指向**函數**的**原型對象**,這個對象被所有實例所共享,存放一些共有屬性或者方法; ``` Person.prototype ----> Person函數的原型對象 ``` > 在構造函數中,同一類相同的方法可以直接寫在構造函數里,但這樣每實例化一個對象都會產生一個新的該方法,但其實這個方法都是一樣的,這樣會浪費大量空間,另外,可以將相同的方法寫在構造函數外,這樣雖然解決了空間浪費問題,但在全局作用域設置變量污染了命名空間,也不安全。這時可以將相同的屬性和方法放在原型對象中。 ### `Constructor` `constructor`屬性**不影響**任何JavaScript的內部屬性。 > constructor其實沒有什么用處,只是JavaScript語言設計的歷史遺留物。由于constructor屬性是可以變更的,所以未必真的指向對象的構造函數,只是一個提示。不過,從編程習慣上,我們應該盡量讓對象的constructor指向其構造函數,以維持這個慣例。 原型對象都會自動獲得一個constructor屬性,這個屬性是一個指向prototype屬性所在函數的指針。 ``` Person.prototype.constructor -----> Person函數 # 在特定的環境下,constructor也能起到一定作用 var a,b; (function(){ function A(arg1,arg2) { this.a = 1 this.b=2 } A.prototype.log = function () { console.log(this.a) } a = new A() b = new A() })() // 1 a.log() // 1 b.log() # 因為A在閉包里,所以現在我們是不能直接訪問A的,那如果我想給類A增加新方法怎么辦? // a.constructor.prototype 在chrome,firefox中可以通過 a.__proto__ 直接訪問 a.constructor.prototype.log2 = function () { console.log(this.b) } // 2 a.log2() // 2 b.log2() ``` ### `__proto__` `__proto__`是指向本對象的原型對象的指針。可稱為隱式原型,一個對象的隱式原型指向構造該對象的構造函數的原型,這也保證了實例能夠訪問在構造函數原型中定義的屬性和方法。 ``` person.__proto__ --------> Person.prototype ``` ## 原型鏈變量查找機制 查找機制是這樣的:**首先會先在實例上面搜索屬性,如果找到了直接返回,否則就繼續去原型上面尋找**。 > 圖解指向 ![](https://img.kancloud.cn/5b/2b/5b2bdaccb8f7495d62193e95c1480750_518x245.png) > 原型鏈簡圖 ![](https://img.kancloud.cn/6c/60/6c60fcd0a8db3e7fa6a09fe690f9474f_604x497.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看