日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JavaScript原型学习

發布時間:2025/5/22 javascript 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaScript原型学习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原型:
  原型是一個對象,任何對象默認都有一個原型,唯一例外的是默認的對象原型,它在原型鏈的頂端。

?

對象:
  對象是無需鍵值對的集合。
  在JavaScript中,如果不是一個主數據類型(undefined/null/boolean/number/string)就是一個對象。
  一個對象的原型,被對象內部的[[prototype]]屬性(propety)所持有。

?

原型訪問器:
  ①ECMA標準對象原型訪問器:Object.getPrototype(obj)【FireFox、Chrome支持】
  ②非標準對象原型訪問器:__proto__ 【除了IE都支持】
  ③當上述2種不起作用時,可通過對象的構造函數找到它的原型:obj.constructor.prototype【所有瀏覽器支持】

var a = {};Object.getPrototypeOf(a); //[object Object] a.__proto__; //[object Object] a.constructor.prototype; //[object Object]

  當嘗試獲取一個主數據類型的原型時,它會被強行轉換為一個對象:

false.__proto__ === Boolean(false).__proto__; //true

?

?在繼承中使用原型:
  原型的魅力在于多個實例共用一個通用原型。
  讓一個實例對象 繼承一個已經存在的對象(如Array)的功能:

var a = {}; a.__proto__ = Array.prototype; //為a對象的原型 賦值 Array的原型屬性 a.length; // 0

?  原型對象【某個對象(如上述a)的原型引用的對象(如Array)】的屬性【如Array.prototype】一旦定義,就可以被多個引用它的實例所繼承。

?

?原型的繼承也是構造函數之所以存在的原因:
  構造函數是一種方便的跨瀏覽器機制,允許在創建實例時 為實例提供一個通用的原型。

constructor.prototype屬性
  JavaScript沒有區別構造函數(constructor)和其他函數,故每個函數都有一個原型屬性(prototype),不是函數則沒有。

Math.max.prototype; //[object Object]var a = function(name){this.name = name; }a.prototype; //[object Object] Math.prototype; // null

  函數a的原型屬性(prototype propety)是一個對象,當函數a創建實例時,函數的原型屬性會作為原型 賦值給所有對象實例。
  即,所有實例的原型(如oIns.__proto__) 引用的都是函數的原型屬性(如a.prototype)。

//創建一個函數b var b = function(){ var one; } //使用b創建一個對象實例c var c = new b(); //查看b 和c的構造函數 b.constructor; // function Function() { [native code]} b.constructor==Function.constructor; //true c.constructor; //實例c的構造函數 即 b function(){ var one; } c.constructor==b //true//b是一個函數,查看b的原型如下 b.constructor.prototype // function (){} b.__proto__ //function (){}//b是一個函數,由于javascript沒有在構造函數constructor和函數function之間做區分,所以函數像constructor一樣, //有一個原型屬性,這和函數的原型(b.__proto__ 或者b.construtor.prototype)是不一樣的 b.prototype //[object Object] 函數b的原型屬性 b.prototype==b.constructor.prototype //fasle b.prototype==b.__proto__ //false b.__proto__==b.constructor.prototype //true//c是一個由b創建的對象實例,查看c的原型如下 c.constructor.prototype //[object Object] 這是對象的原型 c.__proto__ //[object Object] 這是對象的原型 c.constructor.prototype==b.constructor.prototype; //false c的原型和b的原型比較 c.constructor.prototype==b.prototype; //true c的原型和b的原型屬性比較//為函數b的原型屬性添加一個屬性max b.prototype.max = 3 //實例c也有了一個屬性max c.max //3 上面的例子中,對象實例c的原型和函數的b的原型屬性是一樣的,如果改變b的原型屬性,則對象實例c 的原型也會改變

?

一個函數的原型屬性(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:判斷原型

var A = function() {} var B = new A();B.__proto__ == A.prototype; B instanceof A; //true; B.__proto__ = Function.prototype; B instanceof A; //false

?

?

原型的應用:實現復制字符串的方法

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次

?

繼承原理,原型鏈:
  每個對象都有一個原型,對象的原型指向父,而父的原型指向父的父,通常把通過原型層層鏈接起來的關系?稱為原型鏈。
  原型鏈的末端一般是?默認的對象原型。

a.__proto__ = b; b.__proto__ = c; c.__proto__ = {}; //default object {}.__proto__.__proto__; //null

?

  原型的繼承機制?是發生在內部且隱式的,當要獲取一個對象的屬性時,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原型学习的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。