成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

圖解Javascript原型(prototype)鏈

開發(fā) 后端
本文嘗試闡述Js中原型(prototype)、原型鏈(prototype chain)等概念及其作用機制。

 本文嘗試闡述Js中原型(prototype)、原型鏈(prototype chain)等概念及其作用機制。

 

[[167207]]

我們知道,在Js中一切皆為對象(Object),但是Js中并沒有類(class);Js是基于原型(prototype-based)來實現(xiàn)的面向?qū)ο?OOP)的編程范式的,但并不是所有的對象都擁有 prototype 這一屬性:

var a = {};

console.log(a.prototype); //=> undefined

var b = function(){};

console.log(b.prototype); //=> {}

var c = 'Hello';

console.log(c.prototype); //=> undefined

prototype 是每個 function 定義時自帶的屬性,但是Js中 function 本身也是對象,我們先來看一下下面幾個概念的差別:

1. function 、 Function 、 Object 和 {}

function 是Js的一個關(guān)鍵詞,用于定義函數(shù)類型的變量,有兩種語法形式:

function f1(){

console.log('This is function f1!');

}

typeof(f1); //=> 'function'

var f2 = function(){

console.log('This is function f2!');

}

typeof(f2); //=> 'function'

如果用更加面向?qū)ο蟮姆椒▉矶x函數(shù),可以用 Function :

var f3 = new Function("console.log('This is function f3!');");

f3(); //=> 'This is function f3!'

typeof(f3); //=> 'function'

typeof(Function); //=> 'function'

實際上 Function 就是一個用于構(gòu)造函數(shù)類型變量的類,或者說是函數(shù)類型實例的構(gòu)造函數(shù)(constructor);與之相似有的 Object 或 String 、 Number 等,都是Js內(nèi)置類型實例的構(gòu)造函數(shù)。比較特殊的是 Object ,它用于生成對象類型,其簡寫形式為 {} :

var o1 = new Object();

typeof(o1); //=> 'object'

var o2 = {};

typeof(o2); //=> 'object'

typeof(Object); //=> 'function'

2. prototype VS __proto__

清楚了上面的概念之后再來看 prototype :

Each function has two properties: length and prototype

prototype 和 length 是每一個函數(shù)類型自帶的兩個屬性,而其它非函數(shù)類型并沒有(開頭的例子已經(jīng)說明),這一點之所以比較容易被忽略或誤解,是因為所有類型的構(gòu)造函數(shù)本身也是函數(shù),所以它們自帶了 prototype 屬性:

// Node

console.log(Object.prototype); //=> {}

console.log(Function.prototype);//=> [Function: Empty]

console.log(String.prototype); //=> [String: '']

除了 prototype 之外,Js中的所有對象( undefined 、 null 等特殊情況除外)都有一個內(nèi)置的 [[Prototype]] 屬性,指向它“父類”的 prototype ,這個內(nèi)置屬性在ECMA標(biāo)準(zhǔn)中并沒有給出明確的獲取方式,但是許多Js的實現(xiàn)(如Node、大部分瀏覽器等)都提供了一個 __proto__ 屬性來指代這一 [[Prototype]] ,我們通過下面的例子來說明實例中的 __proto__ 是如何指向構(gòu)造函數(shù)的 prototype的:

var Person = function(){};

Person.prototype.type = 'Person';

Person.prototype.maxAge = 100;

var p = new Person();

console.log(p.maxAge);

p.name = 'rainy';

Person.prototype.constructor === Person; //=> true

p.__proto__ === Person.prototype; //=> true

console.log(p.prototype); //=> undefined

上面的代碼示例可以用下圖解釋:

Person 是一個函數(shù)類型的變量,因此自帶了 prototype 屬性, prototype 屬性中的 constructor 又指向 Person 本身;通過 new 關(guān)鍵字生成的 Person 類的實例 p1 ,通過 __proto__ 屬性指向了 Person 的原型。這里的 __proto__ 只是為了說明實例 p1 在內(nèi)部實現(xiàn)的時候與父類之間存在的關(guān)聯(lián)(指向父類的原型),在實際操作過程中實例可以直接通過 . 獲取父類原型中的屬性,從而實現(xiàn)了繼承的功能。

3. 原型鏈

清楚了 prototype 與 __proto__ 的概念與關(guān)系之后我們會對“Js中一切皆為對象”這句話有更加深刻的理解。進而我們會想到,既然 __proto__ 是(幾乎)所有對象都內(nèi)置的屬性,而且指向父類的原型,那是不是意味著我們可以“逆流而上”一直找到源頭呢?我們來看下面的例子:

// Node

var Obj = function(){};

var o = new Obj();

o.__proto__ === Obj.prototype; //=> true

o.__proto__.constructor === Obj; //=> true

Obj.__proto__ === Function.prototype; //=> true

Obj.__proto__.constructor === Function; //=> true

Function.__proto__ === Function.prototype; //=> true

Object.__proto__ === Object.prototype; //=> false

Object.__proto__ === Function.prototype; //=> true

Function.__proto__.constructor === Function;//=> true

Function.__proto__.__proto__; //=> {}

Function.__proto__.__proto__ === o.__proto__.__proto__; //=> true

o.__proto__.__proto__.__proto__ === null; //=> true

從上面的例子和圖解可以看出, prototype 對象也有 __proto__ 屬性,向上追溯一直到 null 。

new 關(guān)鍵詞的作用就是完成上圖所示實例與父類原型之間關(guān)系的串接,并創(chuàng)建一個新的對象; instanceof 關(guān)鍵詞的作用也可以從上圖中看出,實際上就是判斷__proto__ (以及 __proto__.__proto__ …)所指向是否父類的原型:

var Obj = function(){};

var o = new Obj();

o instanceof Obj; //=> true

o instanceof Object; //=> true

o instanceof Function; //=> false

o.__proto__ === Obj.prototype; //=> true

o.__proto__.__proto__ === Object.prototype; //=> true

o.__proto__.__proto__ === Function; //=> false

責(zé)任編輯:趙立京 來源: 程序師
相關(guān)推薦

2020-09-10 07:04:30

JSJavaScript 原型鏈

2023-08-28 07:12:54

2020-02-20 14:00:15

JavaScript原型原型鏈

2017-04-07 11:15:49

原型鏈原型Javascript

2022-06-20 09:22:55

js原型鏈前端

2012-11-08 10:40:47

JavaScript原型鏈

2022-05-26 09:20:01

JavaScript原型原型鏈

2020-10-20 08:35:34

JS基礎(chǔ)進階

2016-05-06 14:02:18

JavaScript原型鏈

2024-08-09 12:44:45

JavaScript原型鏈鏈條

2012-01-05 15:07:11

JavaScript

2021-05-18 08:52:31

Prototype 原型模式設(shè)計模式

2017-05-05 10:31:35

JavaScriptprototype__proto__

2022-04-14 20:43:24

JavaScript原型鏈

2022-03-29 09:15:55

Javascript函數(shù)屬性

2016-12-27 09:10:29

JavaScript原型鏈繼承

2021-10-20 18:44:43

編程對象JavaScript

2011-08-31 14:48:33

JavaScript

2019-02-27 16:00:48

JS原型原型鏈對象

2024-08-27 12:36:33

點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 伊人超碰 | 国产成人精品一区二区三区视频 | 欧美精品成人一区二区三区四区 | 伊人欧美视频 | 国产精品久久网 | 亚洲激情网站 | 久久久青草婷婷精品综合日韩 | 亚洲综合区 | 五月天激情综合网 | www.日韩欧美| 久久国产日韩 | 亚洲精品久久国产高清情趣图文 | 蜜桃av一区二区三区 | 日韩午夜电影在线观看 | 欧美国产日韩精品 | 精品一区二区av | av中文在线| 亚洲国产欧美一区二区三区久久 | 热久久性| 色爱综合网 | 久久一二 | 亚洲精品第一国产综合野 | 久久国产精品首页 | 一级免费在线视频 | 国产精品视频网站 | 91se在线 | 亚洲毛片网站 | 国产精品久久久久久吹潮 | 亚洲精品天堂 | 精品99在线 | 欧美精品啪啪 | 欧美a√ | 超碰高清 | av天天爽| 久久久亚洲 | 久久一区二区三区四区 | 成人福利在线 | www日本高清 | 欧洲妇女成人淫片aaa视频 | 午夜精品久久 | 国产999精品久久久久久绿帽 |