首页 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并使

es6中什么是原型链 es6中什么是原型链 Nov 15, 2022 pm 07:28 PM

原型链,简单理解就是原型组成的链。当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的__proto__隐式原型上查找,即它的构造函数的prototype,如果还没有找到就会再在构造函数的prototype的__proto__中查找,这样一层一层向上查找就会形成一个链式结构,被称为原型链。

深入探讨:面向对象编程中原型和原型链的作用剖析 深入探讨:面向对象编程中原型和原型链的作用剖析 Jan 11, 2024 am 11:59 AM

深入剖析:原型和原型链在面向对象编程中的角色,需要具体代码示例在面向对象编程(OOP)中,原型(Prototype)和原型链(PrototypeChain)是重要的概念。它们提供了一种基于对象的代码复用机制,并且在Javascript等语言中扮演着关键的角色。在本文中,我们将深入剖析原型和原型链的概念,探讨它们在OOP中的作用,并通过具体的代码示例进行说明

js原型和原型链有什么作用 js原型和原型链有什么作用 Nov 09, 2023 pm 04:56 PM

js原型和原型链的作用是实现对象的继承,节省内存空间,并提高代码的性能和可维护性。详细介绍:1、实现对象的继承,原型和原型链允许创建一个对象,并使其继承另一个对象的属性和方法,当创建一个新的对象时,可以将其原型指向另一个对象,这样新对象就可以访问到原型对象上的属性和方法;2、节省内存和提高性能,在JavaScript中,每个对象都有一个原型,通过原型链,对象可以共享原型上等等。

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

原型和原型链的独特之处探究在JavaScript中,原型(prototype)和原型链(prototypechain)是非常重要的概念。理解原型和原型链的独特之处可以帮助我们更好地理解JavaScript中的继承和对象创建。原型是JavaScript中每个对象都拥有的一个属性,它指向一个其他对象,用于共享属性和方法。每个JavaScript对象都有一个原型

See all articles