makeInstance(以obj为原型对象创建实例)
/*
//对象之间的赋值属于浅复制
var b = {name:"David"};
a = b;
b.name = "Jhon";
console.log(a.name);//"Jhon"
*/
var book = {
bookname:"Js Book",
page:108
}
var makeinstance = function(obj){
function f(){};
f.prototype = obj;//f.prototype和obj对象共同指向一个对象实例
obj = new f;//实例化之后obj._proto_指向f.prototype所指向的实例
f.prototype = null;//垃圾回收
//console.log(obj.__proto__ );
//每个实例都包含[[Prototype]]属性,但是这个属性不可见且不能枚举。
return obj;
}
var a_obj = makeinstance(book);
defer.js
defer利用闭包创建一个延迟执行的函数,封装timeid属性。
var defer = function(fn,delay,exclusion){
var timeId;
return function(){
if(exclusion){
clearTimeout(timeId);
}
timeId = setTimeout(fn,delay);
}
}
domReady.js
类似$(document).ready函数,当dom加载成功后调用相应的函数,这里的写法类似于jq的源码。
var domReady = function(){
var isReady = false
fnArr = [];
function doReady(){
isReady = true;
for(var ci;ci=fnArr.pop();){//这里不用判定ci是否存在?
ci();//可能pop没了就会结束
}
}
return function(onready){
if(document.readyState ==="complete"){//document加载有两个状态interactive和complete
return setTimeout(onready,1);
}
onready&&fnArr.push(onready);
isReady&&doReady();
(function(){
if(isReady)return;
try{
document.documentElement.doScroll("left");//ie中是否确定dom加载成功
}catch(e){
setTimeout(arguments.callee,0);//让渲染线程先占用cpu
return;
}
doReady();
})();
window.attachEvent('onload',doReady);//更好的兼容各浏览器
}
}();