首頁 web前端 js教程 JaveScript中的几个关键概念的理解-原型链的构建_javascript技巧

JaveScript中的几个关键概念的理解-原型链的构建_javascript技巧

May 16, 2016 pm 06:06 PM
原型鏈

Javascript中所有function中都有一个prototype属性,并且这个prototype属性是一个object类型的对象,所有由该function构造出来的对象都具有这个prototype上的特性,也就是说可以用构造出来的对象直接访问prototype上的属性和方法。
下面一段代码演示prototype的使用方法:

复制代码 代码如下:

function Staff(name) {
this.name = name;
}
Staff.prototype.say = function() {
alert(this.name + " say hello");
}
var staff1 = new Staff("hunter");
var staff2 = new Staff("dangjian");
staff1.say();
staff2.say();

运行如上的程序,可知prototype上的属性和方法可以通过创建的对象之间调用,更重要的是prototype中的属性和方法是在同类型的对象中是共享的
复制代码 代码如下:
alert( staff1.say == staff2.say);


prototype另外一个常用的特性是通过prototype构建对象的继承关系,通过把基类对象赋给子类的prototype的方式可以模拟面向对象中的继承关系,这就是大家经常说的JavaScript的面向对象机制。如下的代码段演示了利用这一特性构建对象的继承关系:
复制代码 代码如下:

function Staff(name) { // 基类
this.name = name;
}
Staff.prototype.say = function() {
alert(this.name + " say hello");
}
function ManStaff(name, age) { // 子类
this.name = name;
this.age = age;
}
ManStaff.prototype = new Staff(); // 建立继承关系
var manStaff1 = new ManStaff("hunter", 22);
var manStaff2 = new ManStaff("dangjian", 32);
manStaff1.say();
manStaff2.say();

运行代码可知,ManStaff对象中具有了基类Staff中的Say方法,这种继承方式在JavaScript中是通过prototype链来实现的。大家可能熟悉以上的prototype用法,可是作为程序员,我们不光要知道其用法,我们更应该理解其可是prototype的内部机制。下面我们来分析prototype的原理以及prototype链的实现。
要理解prototype的机制就必须要了解JavaScript中function的创建方式。
当代码执行到function Staff(name) {this.name = name;}时,相当于执行var Staff = new Function(“name”, "this.name = name”)解释器将使用预定义好的Function() constructor,来创建一个function类型的object出来,即Staff。

随后给创建好的Staff对象添加__proto__属性,并赋值为Function的构造器的prototype,这一步是所有对象创建过程中都有的步骤,在执行类似var x = new X()方式是,都会把X的prototype赋值给x的__proto__,类似如下的赋值:
复制代码 代码如下:

Staff.__proto__ = Function.prototype;

接下来给Staff创建prototype属性,这一步是创建function类型的对象具有的步骤,创建的过程如下伪代码:
复制代码 代码如下:

var o = new Object();
o.constructor = Base;
Staff.prototype = o;

如上的分析我们可知,当创建对象时,会创建一个私有属性__proto__,当创建function是会创建一个prototype属性。因为Staff是一个function类型的对象,所以会同时具有这两个属性。
这两个属性是构建原型链的关键属性。我们来分析执行代码 var staff1 = new Staff(“hunter”)时,原型是如何传递的。
根据如上分析,staff1.__proto__ = Staff.prototype,而Staff.prototype又是一个由Object创建的对象,即Staff.prototype.__proto__ = Object.prototype,所以staff1.__proto__ .__proto__ 指向的是Object.prototype,即staff1.__proto__ .__proto__ == Object.prototype,这就是原型链,当要读取某个对象的属性时,JS首先找对象本身是否有这个属性,如果没有就会顺着原型链一直寻找这个属性。
知道了原型链的原理,那么就很容易根据这个原理来构建Javascript中的对象继承。
由如上的分析,我们可知原型链的顶端都是Object.prototype,这就意味着在构建的继承关系中Object是所有对象的基类,可以运行如下的代码验证。
复制代码 代码如下:

Object.prototype.location = "China";
function Staff(name) { // 基类
this.name = name;
}
Staff.prototype.say = function() {
alert(this.name + " say hello");
}
var ManStaff1 = new Staff("hunter");
var ManStaff2 = new Staff("dangjian");
alert(ManStaff1.location);
alert(ManStaff2.location);

运行结果知道,Object是Staff的基类,那么要如何构建一个Staff的子类呢?
理解了上面函数的建立原理,我们很容易写出如下的代码:
复制代码 代码如下:

function Staff(name) { // 基类
this.name = name;
}
Staff.prototype.say = function() {
alert(this.name + " say hello");
}
function ManStaff(name, age) { // 子类
Staff.call(this,name);
this.age = age;
}
ManStaff.prototype = new Staff(); // 建立继承关系
var ManStaff1 = new ManStaff("hunter", 22);
var ManStaff2 = new ManStaff("dangjian", 32);
ManStaff1.say();
ManStaff2.say();

建立继承关系的就是这句:ManStaff.prototype = new Staff(); ,继承关系推算如下:ManStaff1.__proto__ = =ManStaff.prototype, ManStaff.prototype.__proto__ = Staff.prototype, Staff.prototype.__proto__ == Object.prototype;则ManStaff1.__proto__.__proto__.__proto__ == Object.prototype。
javascript中的这种继承关系比较传统面向对象的继承关系更松散,构建方式也比较难以理解,但是作为脚本语言,其功能已经是非常强大了。
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

什麼是原型和原型鏈 什麼是原型和原型鏈 Nov 09, 2023 pm 05:59 PM

原型,js中的一個對象,用於定義其他對象的屬性和方法,每個構造函數都有一個prototype屬性,這個屬性是一個指針,指向一個原型對象,當創建新對象時,這個新對象會從其建構子的prototype屬性繼承屬性與方法。原型鏈,當試圖存取物件的屬性時,js會先檢查這個物件是否有這個屬性,如果沒有,那麼js就會轉向這個物件的原型,如果原型物件也沒有這個屬性,會繼續尋找原型的原型。

什麼作用域鍊和原型鏈 什麼作用域鍊和原型鏈 Nov 13, 2023 pm 01:46 PM

作用域鍊和原型鍊是JavaScript中兩個重要的概念,分別對應著作用域和繼承兩個核心特性:1.作用域鍊是JavaScript中用來管理變數存取和作用域的機制,其形成是由函數創建時所處的執行上下文環境和詞法作用域決定的;2、原型鍊是JavaScript中實現繼承的機制,基於對象之間的原型關係,當訪問對象的屬性或方法時,如果該對象本身沒有定義,會沿著原型鏈向上查找。

原型和原型鏈有什麼區別 原型和原型鏈有什麼區別 Nov 09, 2023 pm 04:48 PM

原型和原型鏈的區別是:1、原型是每個物件都具有的屬性,包含了一些共享的屬性和方法,用於實現物件之間的屬性和方法的共享和繼承,而原型鍊是一種透過物件之間的原型關係來實現繼承的機制,定義了物件之間的繼承關係,使得物件可以共享原型物件的屬性和方法;2、原型的作用是定義物件的共享屬性和方法,使得多個物件可以共享同一個原型物件的屬性和方法,而原型鏈的作用是實現物件之間的繼承關係等等。

原型和原型鏈的存在意義是什麼? 原型和原型鏈的存在意義是什麼? Jan 13, 2024 pm 12:58 PM

原型和原型鏈存在的原因是為了實現JavaScript語言中的繼承和物件屬性的共享。在JavaScript中,一切都是對象,包括函數。每個物件都有一個屬性,稱為原型(prototype),它指向另一個對象,該物件被稱為原型物件。物件可以從原型物件繼承屬性和方法。透過原型實現共享屬性和方法的好處是節省記憶體。考慮一個物件A,它有一些屬性和方法,然後建立物件B並使

深入探討:物件導向程式設計中原型和原型鏈的作用剖析 深入探討:物件導向程式設計中原型和原型鏈的作用剖析 Jan 11, 2024 am 11:59 AM

深入剖析:原型和原型鏈在物件導向程式設計中的角色,需要具體程式碼範例在物件導向程式設計(OOP)中,原型(Prototype)和原型鏈(PrototypeChain)是重要的概念。它們提供了一種基於物件的程式碼復用機制,並且在Javascript等語言中扮演關鍵的角色。在本文中,我們將深入剖析原型和原型鏈的概念,探討它們在OOP中的作用,並透過具體的程式碼範例進行說明

es6中什麼是原型鏈 es6中什麼是原型鏈 Nov 15, 2022 pm 07:28 PM

原型鏈,簡單理解就是原型組成的鏈。當存取一個物件的某個屬性時,會先在這個物件本身屬性上查找,如果沒有找到,則會去它的__proto__隱式原型上查找,即它的建構函數的prototype,如果還沒有找到就會再在建構函數的prototype的__proto__中查找,這樣一層一層向上查找就會形成一個鍊式結構,被稱為原型鏈。

探索原型和原型鏈的特殊性 探索原型和原型鏈的特殊性 Jan 13, 2024 pm 03:50 PM

原型和原型鏈的獨特之處探究在JavaScript中,原型(prototype)和原型鏈(prototypechain)是非常重要的概念。理解原型和原型鏈的獨特之處可以幫助我們更好地理解JavaScript中的繼承和物件創建。原型是JavaScript中每個物件都擁有的屬性,它指向一個其他對象,用於共享屬性和方法。每個JavaScript物件都有一個原型

js原型和原型鍊是什麼 js原型和原型鍊是什麼 Jun 14, 2023 am 11:34 AM

js原型和原型鍊是:1、原型,所有的函數預設都有一個「prototype」這樣公有且不可枚舉的屬性,它會指向另一個對象,這個物件就是原型。 2.原型鏈,當存取物件的屬性或方法時,首先物件會從自身去找,找不到就會往原型中去找,也就是它建構函式的「prototype」中,如果原型中找不到,即建構函式中也沒有該屬性,就會往原型後面的原型上去找,這樣就形成了鍊式的結構,稱為原型鏈。

See all articles