一個比較強的分析:針對item的乘除進行封裝成方法,針對不同的方法進行item的乘除,但是還是不夠簡介

來個更加簡潔的:這就有點像java里面的一些封裝,多寫這樣的代碼對之后的專業素養能有一個比較大的提升

原型:
原型prototype其實是function物件的一個屬性,將其列印出來它也是物件,

所有被建構式構造出的物件都可以繼承原型上的屬性和方法,(當然自己有的先向自己找,自己沒有的才去原型上找),任何一個實體化的物件都能訪問對應原型上的方法
這就是為什么方法會寫在原型上面,屬性則寫在函式內部,因為屬性一般要進行配置

讓實體化的物件去增加prototype是不行的,只是添加this的屬性,
而delete 也是無法洗掉prototype的屬性或方法的,delete 只能洗掉實體化物件this里面的屬性或方法的,無法洗掉prototype里面的,

對prototype進行規范化寫法:因為 xxx.prototype是物件的,所以進行物件化的添加屬性與方法,在開發的時候都是這樣的寫法

原型上面的構造器的constructor指向的是建構式本身:

通過xxx.prototype.constructor= xxx ;
改變對應的函式

__proto的產生:在函式實體化之后形成的this{ __proto__:XXX.prototype}
在這里我們要理解:(__proto__屬性一定是屬于實體化物件的,而不是屬于建構式的),
這里的this是隱式的,只是一個隱式表達給你,寫是無法這樣寫的
但js內部的寫法就是這樣子的:

__proto__:設計的時候就是針對自己找不到的屬性和方法能夠通過__proto__來去尋找到prototype里面的屬性與方法,并且為了不讓用戶修改用了__ 這樣的寫法,
__proto__相當于一個容器,能夠有個指標能夠指向prototype,通過指標來去訪問實體物件的prototype,相當于門牌號

當然__proto__的指向也是能夠更改的,只是沒有什么意義

練習:

這里對var car =new Car()進行了實體化,所以實體化之后的prototype是沒有變化的;

只是在__proto__下面的constructor下面的prototype進行了修改
后面的對Car.prototype ={ name:'Mazda'} 的修改,是沒有修改實體化之后的prototype,修改的是實體化之前的prototype

那么這樣:car.prototype.name='Mazda'這樣是對this里面的__proto__:進行的一個重新賦值,并相當于重寫prototype
為什么要把某些屬性和方法放在prototype里面,為了一些屬性值和方法一樣的時候放在prototype進行繼承,如果要傳引數,動態的獲取這個屬性的時候,才會放在建構式里面
講一個非常非常有用的東西,跟上面原理不一樣,
window和return的問題:
下面這樣return 和window實作的是一樣的功能

window的方法能夠直接執行的,因為在函式內部就進行了保存,return則是要進行賦值一個全域變數才能進行執行函式

對于立即執行函式是非常好寫插件的東西,因為在立即執行函式中宣告變數是不會污染全域變數的,可以進行隔離
一個插件的標準:

對于立即執行函式有一個好的習慣先寫一個(;分號)主要是為了怕忘記寫,程式不會出錯,跟函式宣告變成運算式是不一樣的

作業:
寫一個插件,任意傳兩個數字,呼叫插件內部方法可進行加減乘除功能
;(function(){ var compute =function(opt){ this.x =opt.firstNum this.y =opt.secondNum } compute.prototype={ plus:function(){ return this.x+this.y }, minus:function(){ return this.x-this.y }, mul:function(){ return this.x*this.y }, div:function(){ return this.x/this.y } } window.Compute=compute })()
var compute = new Compute({ firstNum:1, secondNum:2 })
console.log(compute.plus()); console.log(compute.minus()); console.log(compute.mul()); console.log(compute.div());
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/270893.html
標籤:其他
