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