更新:讀 arale 原始碼之 attribute 篇
arale 是阿里、開源社群明星人物--玉伯,開發的一套元件,**相當優美,大讚玉伯的開源精神,我是您的粉絲。這裡分享下我對這段源**的感悟,若有錯誤的地方,煩請指正。= ̄ω ̄=
先看看 segementfault 上討論的一道題。
function f() {}
object.prototype.a = function() {}
function.prototype.b = function() {}
var f = new f()
// f.a f.b f.a
f 可以呼叫 a 和 b,因為 f 的原型鏈是這樣的。(直觀解釋:f 是 function 例項,f 繼承自 object)
f ----> function.prototype ----> object.prototype ----> null
//既 f.__proto__ === function.prototype
// function.prototype.__proto__ === object.prototype
// object.prototype.__proto__ === null
而 f 只能呼叫 a , f 的原型鏈是這樣的。(直觀解釋:f 是 f 的例項,一切皆物件,f 繼承自 object)
f ----> f.prototype ----> object.prototype ----> null
//既 f.__proto__ === f.prototype
// f.prototype.__proto__ === object.prototype
// object.prototype.__proto__ === null
在 f 的原型鏈上並沒有 function.prototype . 因此訪問不到 b 。
注意,訪問原型物件__proto__
是非標準方法,es5 標準方法是 object.getprototypeof();
到這裡,基於原型鏈的繼承已經很明顯了,只需要
function animal() {}
function dog() {}
dog.prototype.__proto__ = animal.prototype;
var dog = new dog();
// dog.__proto__ --> dog.prototype;
// dog.__proto__.__proto__ --> animal.prototype
基於 es5 標準寫法是
dog.prototype = object.create(animal.prototype);
// 建立原型鏈
function ctor() {};
var createproto = object.__proto__ ? function(proto)
} : function(proto)
有三種寫法可以實現原型鏈繼承,但是我測試 new ctor 是最慢的啊,object.creaete 其次,__proto__
是最快的。
function ctor() {}
function getproto1(proto, c)
function getproto2(proto, c)
})}function getproto3(proto, c)
}
接著往下看。。。
function class(o)
}function classify(cls)
這種寫法是,當不使用new
關鍵字呼叫時,將引數類化
,如:
修改:是不支援new
的方式呼叫。
function animal() {}
animal.prototype.talk = function() {}
//class(animal); animal 擁有了 extend 和 implement 方法
var dog = class(animal).extend(
})
class 的三個變種屬性extends
implements
statics
這三個屬性會做特殊處理
class.mutators = ,
// 混入屬性,可以混入多個類的屬性
implements: function(items)
},statics: function(staticproperties)
}
再來看看implement
方法, 它是用來混入屬性的。
三個變種屬性將被執行
function implement(properties) else
}}
好了,最關鍵的方法class.create
來了,它是用來建立類的,可以指定父類。
class.create = function(parent, properties)
properties || (properties = {});
// 如果指定了 extends 屬性, 父類就是它了
parent || (parent = properties.extends || class);
properties.extends = parent;
// 建立子類的建構函式
function subclass()
} // 指定父類的情況下,繼承父類的屬性
if (parent !== class)
// 為子類新增例項屬性,三個特殊屬性,在這裡被執行
implement.call(subclass, properties);
// 返回可繼續 繼承 的子類
return classify(subclass);
}
最後來看看繼承的方法class.extend
,被 classify 的類,都可以繼續建立子類。
class.extend = function(properties) );
// 指定父類為呼叫者
properties.extends = this;
return class.create(properties);
}
最後的最後,簡單介紹它的工具類,helpers
// 屬性混合,增加白名單限制
function mix(r, s, wl) }}}
// .indexof 是 es5 加入的,並非所有瀏覽器都支援。
// 這裡沒有也不需要使用 polyfill 的方式。
var indexof = array.prototype.indexof ? function(arr, item) : function(arr, item)
} return -1;
}// 這個很簡單,只有 object.prototype.tostring 才能知道它的 [[class]]
var tostring = object.prototype.tostring;
var isarray = array.isarray || function(val)
var isfunction = function(val)
讀原始碼之 ArrayBlockingQueue
arrayblockingqueue是concurrent包提供的乙個執行緒安全的佇列,由乙個陣列來儲存佇列元素.通過 b takeindex b 和 b putindex b 來分別記錄出佇列和入佇列的下標,以保證在出佇列時 b 不進行元素移動 b 在出佇列或者入佇列的時候對takeindex或者...
讀JDK原始碼 之NUMBER
number是乙個抽象類,他是bigdecimal,biginteger,byte,double,float,integer,long,short的父類 他提供以下抽象方法 1 public abstract int intvalue 該方法把此物件所代表的值轉換為int 2 public abst...
讀HashSet原始碼
先看建構函式 public hashset public hashset int initialcapacity public hashset int initialcapacity,float loadfactor 這個構造方法不是public的,僅用於linkedhashset.hashset ...