1、向原型鏈上添加屬性為什么用prototype,而一般不用__proto__
2、javascript為什么要設置一個函數對象,他的作用是什么
3、更深層次了解原型鏈
如下兩段代碼,分別是使用對象字面量和構造函數創建對象。
代碼段1:
var a={"name":"nihao"}; console.log(a);
代碼段2:
var a=function(name){ this.name=name; }; var b= new a("nihao"); console.log(b);
首先,我們需要知道:
1、函數對象的原型是對象(原型鏈為:實例,通過new構造函數-->函數對象-->對象-->null)
2、函數有prototype屬性,而對象沒有
然后,在某些場景下,我們有一個公共的屬性,需要多個新建的對象去繼承,這個時候就能體現出函數對象的特點了,我們看下代碼:
1、使用構造器
var a=function(name){ this.name=name; }; a.prototype.sex="nan"; var b= new a("nihao"); console.log(b); console.log(b.name); console.log(b.sex); var c=new a("test"); console.log(c); console.log(c.name); console.log(c.sex);
如上,可以很容易的實現屬性或方法的繼承,在控制臺打印上述代碼,可以很容易看到原型鏈是這樣的(以對象b為例):對象b-->函數對象-->對象-->null
2、使用對象字面量
使用對象字面量創建的是對象,他沒有prototype屬性,所以我們只能通過__proto__,但是在對象上使用__proto__可能會導致一些問題的出現。代碼如下:
var a={"name":"nihao"}; a.__proto__.sex="nan"; console.log(a); console.log(a.name); console.log(a.sex); var b={}; console.log(b); console.log(b.name); console.log(b.sex);
如上,運行上面代碼,可以很容易得到運行結果:
{name: "nihao"} nihao nan {} undefined nan
哎,這個就很奇怪了,b對象明明設置的為空?這是因為在執行a.__proto__.sex="nan";時候,程序向對象的原型上添加了一個屬性sex,而b是對象也是繼承的對象的原型,多以導致了這個問題的出現。
最后,總結下來就是:
函數對象是繼承自對象的原型,有了函數對象,我們可以給函數的原型添加屬性,這些屬性保存在函數對象中,但是又不會影響其他對象。
相關推薦:
淺談js之字面量、對象字面量的訪問、關鍵字in的用法
Javascript中對這兩種對象字面量(json)的操作方式有何不同?
Javascript 中 class、構造函數、工廠函數詳解
以上就是對象字面量和構造函數創建對象詳解的詳細內容,更多請關注php中文網其它相關文章!