javascript
「JavaScript面向对象编程指南」原型
在 JS 中,函數(shù)本身也是一個(gè)包含了方法(如apply和call)和屬性(如length和constructor)的對(duì)象,而prototype也是函數(shù)對(duì)象的一個(gè)屬性
function f(){}
f.constructor //function Function(){[native code]}
可為prototype對(duì)象賦予屬性和方法,只有當(dāng)f作為構(gòu)造器使用時(shí),這些屬性才會(huì)起作用
添加屬性和方法除了在構(gòu)造函數(shù)中,還可通過(guò)prototype屬性來(lái)增加該構(gòu)造器所能提供的功能
function Snake(name){this.name = name;this.eat = function(){} } Snake.prototype.color = 'grey'; Snake.prototype.sleep = function(){}若不想逐一添加,也可定義一個(gè)對(duì)象,然后將其覆蓋到之前原型上
Snake.prototype = {color:'grey';sleep:function(){} }在 JS 中,幾乎所有對(duì)象都是通過(guò)傳引用的方式來(lái)傳遞的,因此所創(chuàng)建的每個(gè)新對(duì)象實(shí)體中并沒(méi)
有一份屬于自己原型副本。這也就意味著可隨時(shí)修改 prototype 屬性,并且由同
一構(gòu)造器創(chuàng)建的所有對(duì)象的 prototype 屬性也都會(huì)同時(shí)改變(甚至還會(huì)影響在修改之前
就已經(jīng)創(chuàng)建了的那些對(duì)象)
訪問(wèn)某個(gè)屬性時(shí),JS引擎會(huì)遍歷該對(duì)象的所有屬性,找到則立即返回,找不到則會(huì)去創(chuàng)建當(dāng)前對(duì)象的構(gòu)造器函數(shù)的原型里找
每個(gè)對(duì)象都會(huì)有一個(gè)構(gòu)造器,而原型本身也是一個(gè)對(duì)象,這意味著它必然也有一個(gè)構(gòu)造器,而這個(gè)構(gòu)造器又會(huì)有自己的
原型。于是這種結(jié)構(gòu)可能會(huì)一直不斷地持續(xù)下去,并最終取決于原型鏈(prototype chain)的長(zhǎng)度,但其最后一環(huán)肯定是 Object 內(nèi)建對(duì)象,因?yàn)樗亲罡呒?jí)的父級(jí)對(duì)象。
使用hasOwnProperty()方法可判斷某屬性是對(duì)象自身屬性還是原型屬性,返回布爾類型,false為原型屬性
對(duì)象中不是所有的屬性都會(huì)在 for-in 循環(huán)中顯示,如(數(shù)組的)length 屬性和
constructor 屬性就不會(huì)被顯示,那些會(huì)顯示的屬性被稱枚舉屬性,可以通過(guò)各個(gè)對(duì)象所提供的 propertyIsEnumerable()方法來(lái)判斷對(duì)象的某
個(gè)屬性是否可枚舉,在 ES5 中,可以具體指定哪些屬性可枚舉,而在 ES3 中沒(méi)有這個(gè)功能
for-in中原型鏈中的各個(gè)原型屬性也會(huì)被顯示出來(lái),當(dāng)然前提是它們是可枚舉的
對(duì)于所有的原型屬性,propertyIsEnumerable()都會(huì)返回 false,包括那些在 for-in 循環(huán)中可枚舉的屬性
每個(gè)對(duì)象都有個(gè)isPrototypeOf()方法,用以判斷當(dāng)前對(duì)象是否是另一個(gè)對(duì)象的原型
var monkey = { name:'Sam' }; function Human(){}; Human.prototype = monkey;var george = new Human();//monkey是george的原型嗎? monkey.isPrototypeOf(george); //true大多數(shù)瀏覽器可得到某個(gè)對(duì)象的原型,因?yàn)榇蠖鄶?shù)瀏覽器都實(shí)現(xiàn)了ES5的Object.getPrototypeOf()方法
Object.getPrototypeOf(george) //{ name:'Sam' }
在IE中不存在__proto__,另外__proto__和prototype并不是等價(jià)的
**__proto__實(shí)際上是某個(gè)實(shí)例對(duì)象的屬性,而prototype則是屬于構(gòu)造器函數(shù)的屬性**
所以__proto__只能在學(xué)習(xí)或調(diào)試的環(huán)境下使用
轉(zhuǎn)載于:https://www.cnblogs.com/Grani/p/10655005.html
超強(qiáng)干貨來(lái)襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的「JavaScript面向对象编程指南」原型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Linux环境编程之同步(四):Posi
- 下一篇: Javascript-自己定义对象转换成