1. 程式人生 > >定時器、引用資料型別、原型

定時器、引用資料型別、原型

定時器

1.定時器是一個非同步物件;

2.定時器有一個返回值,這個返回值代表了在程式中他是第幾個定時器

3.定時器的清除原理是阻止了定時器的函式體執行,這個定時器本身仍然存在,其返回值序號也存在

引用資料型別

在儲存引用資料型別過程中,我們是拿不到引用資料型別裡面的資料的,只有儲存完畢,才可以拿到它的值

var obj={
    name:'js',
    can:(function () {
        console.log(obj);
        return obj.name;
    })(),
    do:function () {}  
};
console.log(obj.can)

原型鏈與作用域鏈 

原型鏈:在建構函式中,如果我們需要找到new出來函式中的某個屬性,就會通過--proto--往所屬類的原型(prototype)一步一步往上查詢,直到找到Object為止,這個查詢的過程就稱為原型鏈;

作用域鏈:在一個函式體中,用到了某個變數,首先我們會在當前作用域下查詢這個變數,如果當前作用域下沒有,就會一級一級往上查詢,直到找到window為止,這個過程稱為作用域鏈;

體驗原型題:

判斷某個屬性是不是函式的公有屬性:先使用in判斷是不是該函式的屬性,然後通過hasOwnProperty判斷是不是私有屬性,如果是false,則是公有屬性!

//in :公有屬性和私有屬性都可以判斷
function FF() {
    this.a="aa";
}
FF.prototype.A="AA";
var f=new FF;

console.log("a" in f);
console.log("A" in f);
//hasOwnProperty判斷是不是自己的私有屬性
console.log(f.hasOwnProperty("a"));
console.log(f.hasOwnProperty("A"));

可以通過constructor.name來判斷某個變數是基本資料型別還是引用資料型別:

//可以使用xx.constructor.name來檢測xx的資料型別
console.log([1, 2, 3].constructor.name);//"Array"
var obj={a:"a"};
console.log(obj.constructor.name);//"Object"
function fn() {}
console.log(fn.constructor.name);//"Function"
var n=1;
var str="123";
var b=true;
console.log(n.constructor.name);
console.log(str.constructor.name);
console.log(b.constructor.name);

原型是一個物件,擁有constructor屬性,如果我們給prototype重新賦值一個物件,此時constructor屬性就會丟失,我們可以手動加上constructor的值。

function FF() {
    this.x="xx";
}
FF.prototype={
    getX:function () {},
    constructor:FF
};
var f =new FF();