javascript对象---3 原型链

本文深入讲解JavaScript中的原型链概念,包括原型对象、原型链指针的特性及其内部工作原理。探讨了如何通过原型链实现继承,并解释了原型对象的创建过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.原型链指针(__prototype__)的特点

1.原型对象(prototype): (本质是一个对象,每一个函数在创建函数时,都是由Function这个对象产生一个原型对象,然后通过指针的方式赋给对象)是函数对象的一个内部属性,值是一个简单的对象,用户可以访问,操作 该对象,可以向原型对象里面添加属性、方法。

2.原型链(__proto__): 每个对象都具备的,不可访问的内部属性(指针)(chorm等浏览器可以访问,但无法操作),指针指向 构造函数 对应的原型对象。(开发人员不能动);每创建一个对象,执行了一次构造函数

,有一个指针指向原型对象。

3.原型链的特点:

原型链的终点是 Object对象 的 prototype 属性,该属性的 __proto__为null ,  所有的链接构成原型链。

原型链是一个从头到尾链接的闭环。

原型链的作用:

使用原型链可以模拟类的功能。

使用原型链可以实现继承关系。

二.原型对象(prototype)的创建:

在预编译或执行匿名函数时,由JS引擎调用 new Function( ) 创建函数对象,以及函数对象的 prototype 对象。只有函数对象才有 prototype 属性。

 

function Fun(){  //函数在JS中也是对象
                 
            }
            //function fun()   以上代码,在预编译阶段相当于下面一句
            var Fun =new Function(); //这句代码就是 function fun()的过程 

 

栈内存中,在预编译阶段已经存在 Object  Function, 首字母大写

Object . toString(); //返回函数定义和函数体

Object : function Object( );  //一个function对象

Function:  function Object( );  //一个function对象

在程序加载前,内存中已经存在

function Object(){

}

function Function(){

}

在预编译阶段相当于定义了两个变量  

var Object = new Function();    //Object是一个特殊的浏览器自己创建的构造函数

var Function = new Function() ;//两个 Function 左侧和右侧的Function相同

在预编译阶段,会加载两个构造函数    Object : 特殊函数,代表对象函数         Function : 函数对象,自省的(自己调用自己创建自己)    var Function = new Function()

下一个问题

1.    var obj = {  //全局变量1 实际值为 object
                name : "ads";
            }

2. var obj =new Object();   obj.name="ads";

1. 和 2. 两个程序是一样的

任何一个对象都有原型链属性,只有函数对象有原型属性.

 

Object.prototype 的原型链 的原型指针指针是最终点。为空,所有对象都可以访问Object.prototype内的方法

Function.prototypre = new Object();

原型链的内部结构,连接方式

prototype 不起到原型链的作用,是指向原型对象的一个指针。__proto__:将原型链连接起来

 

三.原型对象(prototype)的默认属性(不要对prototype直赋值,会覆盖默认属性,导致原型链错误)

function Fun(){  //函数在JS中也是对象
                 
            }
            debgger; 

这里Fun原型对象中有两个属性  Fun.prototype : Object               constructor :function Fun( )         __proto__ : Object
            Fun.prototype = {
                name = 'zhang',
                age:11
            }

因为重新对原型对象赋值,  Fun.prototype : Object    age : 11   name : "张三“  __proto__ : Object  constructor不见了

1. __proto__:prototype对象的原型链。

2.constructor:构造器指针,指向构造函数对象。

四. 修改原型对象的属性:

Fun.prototype.attribute = value; //扩展属性

Fun.prototype.FunName = function(){} ;  // 扩展函数 

修改范例

Fun.prototype.name="zhang";
Fun.prototype.sayhello = function(){
                console.log("hello");
   }

相当于在

Fun.prototype{

name : ”张三“,

sayhello :function

}

 

function Fun(){  //函数在JS中也是对象
                 
 }
        
            Fun.prototype.name="zhang";
            Fun.prototype.sayhello = function(){
                console.log("hello");
            }
            var fun =new Fun();

            var fun1 =new Fun();
            fun.sayhello();  //相当于继承   原型链指针指向构造函数的原型对象

             fun1.sayhello( ) ;也可以  都是继承构造函数的方法,属性

Fun.prototype{   / /fun的原型对象

__proto__ : null  ;

constructor;  //指向他的构造函数,谁创建他指向谁   指向谁  Fun()

}

Fun :new Function{

prototype :

     _proto__ ;

}

constructor不影响原型链,作用,在原型对象(prototype)中可以访问构造函数,只有prototype属性中有constructor,其余对象没有。

扩展原型对象可扩展函数的方法。

五。原型链指针(__prototype__)的特点

1.不可访问性:在IE等浏览器__protoype__属性不可访问。

2.不可操作性,不能修改原型链指针的指向  Fun.__proto__=  //不可以这样写 

3.多元性:所有对象类型,(包括Function)都包含原型链指针。

4.连接性:对象的原型链指针默认指向 构造函数 的prototype对象。但 prototype 对象的 __proto__ 也会作为原型链的一部分,直到连接到Object prototype 对象。object原型对象中__proto__为null

5.通用性:在原型链上所有的 prototype  对象中的属性和函数,对象都可以访问调用。

6.检测上级原型链的方式:

instanceof  例如: Fun instanceof  Function  //true

fun instanceof Fun //true  fun是由Fun创建出的, Fun的原型链在 fun之前(上).

Function instanceof Object //true

Fun.prototype . isPrototypeOf  (fun)  //检测Fun的prototype是否是 fun 原型链上的一环  (此方法来自 Object的prototype 扩展 true,  只能检测 紧接着的两个原型链指针,fun指向 Fun的prototype

 

 

 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/u/2991733/blog/794622

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值