javascript
JavaScript原型学习
原型:
原型是一個對象,任何對象默認都有一個原型,唯一例外的是默認的對象原型,它在原型鏈的頂端。
?
對象:
對象是無需鍵值對的集合。
在JavaScript中,如果不是一個主數據類型(undefined/null/boolean/number/string)就是一個對象。
一個對象的原型,被對象內部的[[prototype]]屬性(propety)所持有。
?
原型訪問器:
①ECMA標準對象原型訪問器:Object.getPrototype(obj)【FireFox、Chrome支持】
②非標準對象原型訪問器:__proto__ 【除了IE都支持】
③當上述2種不起作用時,可通過對象的構造函數找到它的原型:obj.constructor.prototype【所有瀏覽器支持】
當嘗試獲取一個主數據類型的原型時,它會被強行轉換為一個對象:
false.__proto__ === Boolean(false).__proto__; //true?
?在繼承中使用原型:
原型的魅力在于多個實例共用一個通用原型。
讓一個實例對象 繼承一個已經存在的對象(如Array)的功能:
? 原型對象【某個對象(如上述a)的原型引用的對象(如Array)】的屬性【如Array.prototype】一旦定義,就可以被多個引用它的實例所繼承。
?
?原型的繼承也是構造函數之所以存在的原因:
構造函數是一種方便的跨瀏覽器機制,允許在創建實例時 為實例提供一個通用的原型。
constructor.prototype屬性
JavaScript沒有區別構造函數(constructor)和其他函數,故每個函數都有一個原型屬性(prototype),不是函數則沒有。
函數a的原型屬性(prototype propety)是一個對象,當函數a創建實例時,函數的原型屬性會作為原型 賦值給所有對象實例。
即,所有實例的原型(如oIns.__proto__) 引用的都是函數的原型屬性(如a.prototype)。
?
一個函數的原型屬性(function`s prototype propety) 與其原型(prototype)沒有關系:
var a = function(name){this.name = name; } a.prototype == a.__proto__; //false a.__proto__ == Function.prototype; //true?
改變原型引用的原型屬性所在的函數,原型所在的實例會隨著改變:
var A = function(name) {this.name = name;} var B = new A('alpha'); B.name; //'alpha' A.prototype.x = 23; //引用的原型屬性所在的A添加屬性x,原型所在的實例B會隨著添加引用x B.x; //23?
instance?of:判斷原型
?
?
原型的應用:實現復制字符串的方法
String.prototype.times = function(count) {return count < 1 ? '' : new Array(count + 1).join(this); //創建一個數組,將調用方法的字符串作為分隔符,轉換為字符串 }"hello!".times(3); //"hello!hello!hello!"; 復制3次"please...".times(6);//"please...please...please...please...please...please..."; 復制6次?
繼承原理,原型鏈:
每個對象都有一個原型,對象的原型指向父,而父的原型指向父的父,通常把通過原型層層鏈接起來的關系?稱為原型鏈。
原型鏈的末端一般是?默認的對象原型。
?
原型的繼承機制?是發生在內部且隱式的,當要獲取一個對象的屬性時,JavaScript會在原型鏈中查找該屬性,不存在則返回undefined。
?
譯文:blog.jobbole.com/9648/#comment-15216
英文原文:http://javascriptweblog.wordpress.com/2010/06/07/understanding-javascript-prototypes/
轉載于:https://www.cnblogs.com/slowsoul/archive/2013/05/28/3102618.html
總結
以上是生活随笔為你收集整理的JavaScript原型学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STL容器之优先队列
- 下一篇: 取名无力