摘要:如下兩段代碼,分別是使用對象字面量和構(gòu)造函數(shù)創(chuàng)建對象。最后,總結(jié)下來就是函數(shù)對象是繼承自對象的原型,有了函數(shù)對象,我們可以給函數(shù)的原型添加屬性,這些屬性保存在函數(shù)對象中,但是又不會影響其他對象。
看了這篇文章,可以幫助你理解如下內(nèi)容:
1、向原型鏈上添加屬性為什么用prototype,而一般不用__proto__
2、javascript為什么要設(shè)置一個函數(shù)對象,他的作用是什么
3、更深層次了解原型鏈
廢話不多說了,正文開始>>>
對象字面量創(chuàng)建的是對象,而構(gòu)造函數(shù)創(chuàng)建的是函數(shù)對象。為了幫助理解,我寫了一些代碼。
如下兩段代碼,分別是使用對象字面量和構(gòu)造函數(shù)創(chuàng)建對象。
代碼段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、函數(shù)對象的原型是對象(原型鏈為:實例,通過new構(gòu)造函數(shù)-->函數(shù)對象-->對象-->null)
2、函數(shù)有prototype屬性,而對象沒有
然后,在某些場景下,我們有一個公共的屬性,需要多個新建的對象去繼承,這個時候就能體現(xiàn)出函數(shù)對象的特點了,我們看下代碼:
1、使用構(gòu)造器
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);
如上,可以很容易的實現(xiàn)屬性或方法的繼承,在控制臺打印上述代碼,可以很容易看到原型鏈?zhǔn)沁@樣的(以對象b為例):對象b-->函數(shù)對象-->對象-->null
2、使用對象字面量
使用對象字面量創(chuàng)建的是對象,他沒有prototype屬性,所以我們只能通過__proto__,但是在對象上使用__proto__可能會導(dǎo)致一些問題的出現(xiàn)。代碼如下:
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);
如上,運行上面代碼,可以很容易得到運行結(jié)果:
{name: "nihao"} nihao nan {} undefined nan
哎,這個就很奇怪了,b對象明明設(shè)置的為空???這是因為在執(zhí)行a.__proto__.sex="nan";時候,程序向?qū)ο蟮脑蜕咸砑恿艘粋€屬性sex,而b是對象也是繼承的對象的原型,多以導(dǎo)致了這個問題的出現(xiàn)。
最后,總結(jié)下來就是:
函數(shù)對象是繼承自對象的原型,有了函數(shù)對象,我們可以給函數(shù)的原型添加屬性,這些屬性保存在函數(shù)對象中,但是又不會影響其他對象。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/107401.html
摘要:通過對象字面量方式創(chuàng)建對象我們可以直接在創(chuàng)建對象的時候添加功能或者首先定義一個空對象,然后添加屬性和方法上面的空對象為什么打了雙引號這只是一種簡稱而已。 通過對象字面量方式創(chuàng)建對象: 我們可以直接在創(chuàng)建對象的時候添加功能 var person = { name : zqq, age : 28, say : function(){ return ...
摘要:對象字面量定義一個空對象這里的空指的是其自身屬性為空,對象繼承了的屬性和方法添加屬性方法完全刪除屬性方法自定義構(gòu)造函數(shù)用操作符調(diào)用構(gòu)造函數(shù)時,函數(shù)內(nèi)部會發(fā)發(fā)生以下情況創(chuàng)建一個新對象,并且引用了該對象并繼承了該函數(shù)的原型屬性和方法被加入到的引 對象字面量 //定義一個空對象,這里的空指的是其自身屬性為空,dog對象繼承了Object.prototype的屬性和方法 var dog={} ...
摘要:前言重新梳理一下發(fā)現(xiàn)以前說的有問題順便比較兩兩寫法之間的差異性使用對象字面量表示法函數(shù)字面量運行時間嵌套函數(shù)字面量調(diào)用方法函數(shù)字面量運行時間函數(shù)字面量運行時間使用操作符后跟構(gòu)造函數(shù)詳情可參考關(guān)于中的運算符構(gòu)造函數(shù)與原型鏈一些理解構(gòu)造函數(shù)原型 前言 PS:2018/04/14: 重新梳理一下發(fā)現(xiàn)以前說的有問題,順便比較兩兩寫法之間的差異性. 1、使用對象字面量表示法 console.ti...
摘要:三種使用構(gòu)造函數(shù)創(chuàng)建對象的方法和的作用都是在某個特殊對象的作用域中調(diào)用函數(shù)。這種方式還支持向構(gòu)造函數(shù)傳遞參數(shù)。叫法上把函數(shù)叫做構(gòu)造函數(shù),其他無區(qū)別適用情境可以在特殊的情況下用來為對象創(chuàng)建構(gòu)造函數(shù)。 一、工廠模式 工廠模式:使用字面量和object構(gòu)造函數(shù)會有很多重復(fù)代碼,在此基礎(chǔ)上改進(jìn)showImg(https://segmentfault.com/img/bVbmKxb?w=456&...
摘要:支持的類型的內(nèi)置數(shù)據(jù)類型羅列如下自定義自定義這三種類型的賦值是同類似的。這根不同,這因為是沒有包裝類新增的基本類型,只支持函數(shù)式賦值,不支持字面量和函數(shù)構(gòu)造。 JavaScript支持的類型 JS的內(nèi)置數(shù)據(jù)類型羅列如下: undefined null bool number string function object Function Date ...
閱讀 1259·2021-11-11 16:54
閱讀 1780·2021-10-13 09:40
閱讀 976·2021-10-08 10:05
閱讀 3536·2021-09-22 15:50
閱讀 3742·2021-09-22 15:41
閱讀 1893·2021-09-22 15:08
閱讀 2376·2021-09-07 10:24
閱讀 3603·2019-08-30 12:52