js bind 传参、_js中的面向对象(一)
面向對象要解決的問題
提到面向對象,大家的第一反應就是封裝、繼承和多態。對其做如下解釋:
- 封裝:影藏細節(A對A——將多行代碼取個名字或A對B——API調用合作)
- 繼承:繼承的意思就是同上跟上述一樣,直接用另外一件事情的屬性和方法,只需要寫自己需要的屬性和方法即可。
- 多態:一個東西擁有兩種或者多種東西的屬性
因此,封裝使我們減少溝通成本,也減少思維負擔;繼承可以讓我們復用代碼;而多態可以使一個東西更加靈活。
封裝、繼承、多態并不是面向對象終極需求,而是寫代碼的套路問題(定勢思維)
封裝和繼承
JS中跟類對應的叫做構造函數
JS的七種數據類型:Number,String,bool,undefined,null,symbol(存的是值),object(復雜類型、引用類型、對象,存的是內存地址)。
而Object包括如下三種情形:
原型鏈(對象與對象)
var如上定義一個obj,我們可以訪問name和age,但是我們可以訪問obj.toString(),那么toString方法來自哪里?在控制臺使用console.dir()可以看到toString方法來自__proto__。
但是,在編程中,不要使用obj.__proto__來訪問,這樣訪問會造成很多性能上的降低。
var問:若沒有聲明一個對象,則怎么訪問__proto__呢?
window中有一個Object,使用window.Object可以得到,規定在window.Object中必須有一個protoType去存聲明對象的__proto__的內存地址,因此可以通過window.Object.protoType得到跟聲明對象中一致的__proto__
window問:原型鏈只能有一個嗎?怎么實現Array中有push,而Object中沒有push呢?
Array的__proto__和Object的__proto__不一樣。Array的__proto__中有push、pop等方法,而Array的__proto__的__proto__中有toString、valueOf等方法。如下圖所示:
Array中的__proto__因此obj.__proto__.__proto__被稱作原型鏈。大寫的Object是天生就有的,本身就有prototype屬性的,而小寫的object是聲明的Object,必須聲明之后才會有__proto__屬性。
varJS沒有類,只需要給每一個加一個__proto__屬性就可以實現繼承。
this(對象與函數)
函數是什么?函數是一種可執行代碼組成的對象。
為什么說函數就是對象呢? 函數的本質是字符串再加上一些其他的東西。
var var但是,我們還是覺得很智障,為什么要在寫過之后還要傳參進去?那么我們是否可以不傳參數,訪問該對象呢?按照obj.sayName()即可訪問呢?那么問題來了。在上述的對象中sayName中是有參數的,為什么在調用的時候不需要傳入了呢?因此,js引入了this表示自己。改造成如下:
var再看一個。
var函數是獨立的東西,不是一個附屬品,只接受一個輸入,并且有一個輸出。在不使用call的時候,this會隱式的傳進去,則不能很快速明確的確定this的指代。JS中有兩個參數,一個是this,另一個是arguments。顯式的this則使用call調用,隱式的this則瀏覽器去猜。
從上述可以得出如下兩個結論:
那么我們來看看如下的this都指代什么?
function再看看別的this的指代情況。
button以上僅限于隱式調用時this指代的情況。若寫為button.onclick.call(1),則此時的this為傳入的參數。
為了解決this的事情,js引入了箭頭函數,此時就算call也不會改變this的值。call的時候,this指代的都為外面的this。箭頭函數中既沒有this,也沒有arguments。
函數和對象本來沒有關系,通過隱式的this才會有了關系。若使用call,則this是明確的值,即為第一個傳入的參數。
bind用法
bind用法bind即為創建了一個新的函數,會call原先函數的參數,傳入的參數則為this和arguments。
總結
以上是生活随笔為你收集整理的js bind 传参、_js中的面向对象(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汇编为什么分段执行总是执行不了_为什么我
- 下一篇: python django开发工具_利用