亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

章節
問答
課簽
筆記
評論
占位
占位

對象的構建

面向對象(OOP)的語言都有一個特點,它們都會有類的這一概念,通過類可以抽象出創建具體相同方法與屬性的對象。但是ECMAScript中是沒有類的概念的,因此它的對象與基于類的語言如java的定義是有所不同的。

在JavaScript世界中函數作為“一等公民”,它不僅擁有一切傳統函數的使用方式(聲明和調用),而且可以做到像簡單值一樣賦值、傳參、返回,這樣的函數也稱之為第一級函數。不僅如此,而且還可以通過操作符new來充當類的構造器。

函數在充當類的構造器時,原型prototype是一個重要的概念。prototype是構造函數的一個屬性, 該屬性指向一個對象。而這個對象將作為該構造函數所創建的所有實例的基引用(base reference), 可以把對象的基引用想像成一個自動創建的隱藏屬性。 當訪問對象的一個屬性時, 首先查找對象本身, 找到則返回;若不, 則查找基引用指向的對象的屬性(如果還找不到實際上還會沿著原型鏈向上查找,  直至到根)。 只要沒有被覆蓋的話, 對象原型的屬性就能在所有的實例中找到。

類一:

function ajQuery() {
    this.name = 'jQuery';
    this.sayName = function(){
    return this.name
}
var a = new ajQuery()
var b = new ajQuery()
var c = new ajQuery()

 

類二:

function ajQuery() {
    this.name = 'jQuery'
}
ajQuery.prototype = {
    sayName: function() {
    return this.name
    }
}
var a = new ajQuery()
var b = new ajQuery()
var c = new ajQuery()

類一與類二產生的結構幾乎是一樣的,而本質區別就是:類二new產生的a、b、c三個實例對象共享了原型的sayName方法,這樣的好處節省了內存空間,類一則是要為每一個實例復制sayName方法,每個方法屬性都占用一定的內存的空間,所以如果把所有屬性方法都聲明在構造函數中,就會無形的增大很多開銷,這些實例化的對象的屬性一模一樣,都是對this的引用來處理。除此之外類一的所有方法都是拷貝到當前實例對象上。類二則是要通過scope連接到原型鏈上查找,這樣就無形之中要多一層作用域鏈的查找了。

jQuery對象的構建如果在性能上考慮,所以就必須采用原型式的結構:

jQuery = function( selector, context ) {
    return new jQuery.fn.init( selector, context );
}
jQuery.fn = jQuery.prototype = {
    init:function(){
    return this
},
    jquery: version,
    constructor: jQuery,
    ………………
}
var a = $() ;

使用原型結構,性能上是得到了優化,但是ajQuery類這個結構與目標jQuery的結構的還是有很大不一致:

   ?   沒有采用new操作符;

   ?   return返回的是一個通過new出來的的對象 。

 

附:

所有案例的github下載地址

 

 

任務

?不會了怎么辦
||

提問題

寫筆記

公開筆記
提交
||

請驗證,完成請求

由于請求次數過多,請先驗證,完成再次請求

加群二維碼

打開微信掃碼自動綁定

您還未綁定服務號

綁定后可得到

  • · 粉絲專屬優惠福利
  • · 大咖直播交流干貨
  • · 課程更新,問題答復提醒
  • · 賬號支付安全提醒

收藏課程后,能更快找到我哦~

使用 Ctrl+D 可將課程添加到書簽

邀請您關注公眾號
關注后,及時獲悉本課程動態

舉報

0/150
提交
取消
全部 精華 我要發布
全部 我要發布
最熱 最新
只看我的

手記推薦

更多

本次提問將花費2個積分

你的積分不足,無法發表

為什么扣積分?

本次提問將花費2個積分

繼續發表請點擊 "確定"

為什么扣積分?