以下是我自己對自定義函式,內建建構函式object()、function(),原型prototype與__proto__它們的聯絡的理解:
js裡有許多內建的建構函式,例如:object(),function(),date(),array()等
1. 每個物件都有乙個__proto__屬性,該屬性指向建立這個物件的函式的prototype。 (這裡就沒管ie,直接用__proto__屬性,這樣好理解一點)
2. 每個函式都有乙個prototype屬性,該屬性是乙個物件,物件有__proto__屬性。物件都是被object()函式建立,所以函式的__proto__屬性值指向object.prototype。 即 函式.prototype.__proto__===object.prototype
3. 函式也是物件,也有__proto__屬性值,該值指向建立它函式的prototype值,它是被function()建立。所以函式的prototype屬性指向function的prototype
4. 所有函式都是被function()內建建構函式所建立
5. 所有物件都是被object()內建建構函式所建立
6. 通過object.create(null)建立的物件是沒有原型鏈的
7. object()也是函式,函式也是物件有__proto__,函式是被function()函式所建立。因此object.__proto__===function.prototype
8. object是函式,也有prototype屬性,該屬性是個物件,也有__proto__屬性,但是object.prototype.__proto__===null
9. function()是函式,函式也屬於物件,它是被它自身所建立,所以function.__proto__===function.prototype
10. function()是函式,也有prototype屬性,該屬性是個物件,也有__proto__屬性,物件都是被object()函式建立,所以它的__proto__屬性指向object.prototype。所以function.prototype.__proto__===object.prototype
還是寫個例子:
function fn(){};//是否大寫我一直糾結。為了規範,fn還是首字母大寫,畢竟是作為建構函式用。
var a=new fn();
1) a是乙個被fn建構函式建立的物件,物件有__proto__,所以a.__proto__===fn.prototype
2) fn是個函式,函式也屬於物件,也有__proto__,fn它是被function()函式所建立,所以fn.__proto__===function.prototype
3) fn.prototype也是乙個物件,物件有__proto__屬性值,物件都是被object()函式所建立,所以fn.prototype.__proto__===object.prototype
4) object()是個函式,所以它是被function()所建立,所以object.__proto__===function.prototype
5) object是函式,也有prototype屬性,該屬性是個物件,也有__proto__屬性,但是object.prototype.__proto__===null 這裡需要注意
6) function()是函式,函式也屬於物件,它是被它自身所建立,所以function.__proto__===function.prototype
7) function()是函式,也有prototype屬性,該屬性是個物件,也有__proto__屬性,物件都是被object()函式建立,所以function.__proto__===function.prototype
一些原型的理解 2
函式的prototype屬性 給原型物件新增屬性 一般都是方法 函式的prototype屬性 在定義函式時自動新增的,預設值是乙個空object物件 物件的 proto 屬性 建立物件時自動新增的,預設值為建構函式的prototype屬性值 所有函式都是function的例項 包含function自...
js 原型 原型鏈理解
執行發現如下 自定義乙個函式,函式包含兩個關鍵資料 prototype,proto 1 原型 prototype person具有prototype屬性 包含我們定義的屬性name,age以及constructor,並且constructor指向我們的person函式,可以理解為prototype就...
hasOwnProperty自我理解
暫時不考慮es6中symbol,hasownproperty 方法返回的是乙個物件上是否包含乙個指定屬性,如果含有則返回true,如果沒有則返回false。和in 運算子不同,該方法會忽略掉那些從原型鏈上繼承到的屬性。這一特性嚐嚐用來檢測乙個物件上是否包含自身擁有的屬性,並且不是從原型鏈上繼承而來的...