html5原型链,彻底深刻理解js原型链之prototype,__proto__以及constructor(一)

前言以下概念请花费一定的时间彻底理解,才能进行下一步,思考题一定要思考,这样才能彻底掌握原型链的知识点,教程中如果有任何的错误不足请指正!

函数对象

由function创造出来的函数,比如:function a(){};

var b=function(){};

系统内置的函数对象Function,Object,Array,String,Number

只有函数对象才有 prototype属性 ,重要的事情说三遍!思考: js的引用数据类型都属于函数对象吗?

普通对象

除开函数对象之外的对象都是普通对象var b='qwe'; // b 是字符串类型,属于普通对象

var c=123;; // c 是数字类型,属于普通对象思考:js有五种基本类型:Undefined,Null,Boolean,Number和String,他们都是属于普通对象吗?

原型对象

prototype属性也叫原型对象,主要是为了实现继承和共享属性;

可以说我们的每一次编程,内在都有原型对象来发挥着作用,如果你没有掌握原型对象的含义,那么你的js还没有真正的入门!function a(){};

首先对象 a 是由Function创造出来,是函数对象;那么根据我们以上的教程,a 就有了prototype属性,那么这个原型对象是怎么创造出来的呢?

来看下面这个例子:var temp = new a();

a.prototype=new Object();

a.prototype = temp;

那么a的prototype属性就是这样创造出来的;思考:原型对象prototype 属于函数对象吗?

指针__proto__

JavaScript中,万物皆对象!所有的对象obj都具有proto属性(null和undefined除外),可称为隐式原型,一个对象的隐式原型指向构造该对象的构造函数的原型

请看以下例子帮助理解:function a(){};

var obj=new a();

console.log(a.__proto__===Function.prototype); //true

console.log(a.prototype.__proto__===Object.prototype); //true

console.log(obj.__proto__===a.prototype); //true思考一下,var obj={}; obj.prototype.__proto__指向谁?

构造函数属性constructor

假设 obj 是由函数对象 a 由new运算创造出来的,那么obj的constructor 的属性就存放着一个对 a 的引用,通过这个构造函数,我们还可以为 a添加其他属性和方法,

这个属性的最初设计是为了检测对象的数据类型,不过后来人们通过此属性的特性做了更多的事情

请看以下例子:function a(){};

var obj=new a();

obj.constructor.b=`我是a的新的属性`;

console.log(a.b); //我是a的新的属性

console.log(a.constructor===Function); //true

console.log(a.prototype.constructor===a); //true

console.log(obj.constructor===a); //true

函数a是由Function创造出来,那么它的constructor指向的Function,obj是由new a()方式创造出来,那么obj.constructor理应指向a思考:a.prototype.__proto__.constructor指向谁?

思考题解答

函数对象思考题解答思考: js的引用数据类型都属于函数对象吗?

引用类型值:指的是那些保存在堆内存中的对象,意思是,变量中保存的实际上只是一个指针,这个指针执行内存中的另一个位置,由该位置保存对象

那么数组,普通对象,函数对象都算是引用数据类型,引用数据类型范围包含函数对象的范围

普通对象思考题解答思考:js有五种基本类型:Undefined,Null,Boolean,Number和String,他们都是属于普通对象吗?

基本类型值:指的是保存在栈内存中的简单数据段;除开函数对象之外的对象都是普通对象,那么普通对象范围是包含基本数据类型的事实上(函数对象,普通对象)以及(基本数据类型,引用数据类型)是在不同角度对js变量进行的定义

原型对象思考题解答思考:原型对象prototype 属于函数对象吗?

事实上 这个问题要进行分别回答:

Function.prototype 属于函数对象,其他对象的prototype属于普通对象function a(){};

console.log(typeof Function.prototype); // function

console.log(typeof a.prototype); //object

前面说过prototype的创造过程var temp = new a();

a.prototype = temp;

这里temp当然就是普通对象啦,但是看下Function的prototype创造过程var a = new Function();

Function.prototype = a;

看明白了把,Function的prototype为什么是函数对象了吧?回忆一下函数对象的定义吧!

指针__proto__思考题解答思考一下,var obj={}; obj.prototype.__proto__指向谁?

这里分步思考:

1, obj只是一个普通对象

2, 什么类型的对象是有prototype属性的?当然是函数对象

3, 所以obj是没有prototype属性的

4, 所以obj.prototype===undefined

5, 所以此题的最终问题是:undefined.proto指向什么

6, 所有的对象obj都具有proto属性(null和undefined除外)!所以答案是 js报错(有没有一种被我坑了的感觉)

构造器constructor思考题解答思考:a.prototype.__proto__.constructor指向谁?function a(){};

这里继续分解题目:

1, a.prototype指向a的一个实例,我们已经多次强调了,而且属于普通对象

2, __proto__定义为:指向创造obj对象的函数对象的prototype属性,所以看下谁创造了a.prototype,因为a.prototype是普通对象,类型为object,那么是Object创造了它,

3, 那么显而易见a.prototype.__proto__指向了Object.prototype

4, 那么题目简化为Object.prototype.constructor指向谁

5, 继续分解题目,Object.prototype为基本对象,那么就是Object创造了它,那么它的constructor就指向了ObjectObject.prototype.constructor===Object //true

不知道你晕不晕,我有点晕,这产生了蛋生鸡还是鸡生蛋的问题啦~

放心,还是有尽头的 :Object.prototype.__proto__===null //true

这个例子告诉我们是 是null创造了一切““这不就是易经中的:道生一,一生二,二生三,三生万物!

b739ec46bb5c46d9c0aa4ce35ba1ea56.png

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[彻底深刻理解js原型链之prototype,__proto__以及constructor(一)]http://www.zyiz.net/tech/detail-147401.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 原型是每个 JavaScript 对象都有的一个内部属性,它指向另一个对象,该对象包含共享属性和方法。原型链是由原型对象组成的链,它允许对象继承另一个对象的属性和方法。当我们访问一个对象的属性或方法时,如果该对象本身没有该属性或方法,JavaScript 引擎会沿着原型链向上查找,直到找到该属性或方法或者到达原型链的顶端。 ### 回答2: 在JavaScript中,每个对象都有一个原型对象,它是用来共享属性和方法的。当我们访问一个对象的属性或方法时,如果对象本身没有这个属性或方法,JavaScript会沿着原型链依次查找,直到找到该属性或方法或者找不到为止。 原型对象是通过构造函数创建的,可以将构造函数的原型属性称为原型对象。当我们使用构造函数创建一个对象时,这个对象会自动继承构造函数的原型对象上的属性和方法。 原型链是由一系列对象的原型对象组成的链状结构。当我们访问一个对象的属性或方法时,JavaScript会先查找对象本身是否有该属性或方法,若没有则会去它的原型对象中查找,若原型对象中仍然没有,则继续查找原型对象的原型对象,直到查找到顶层的Object.prototype对象为止。 当一个函数被定义时,它会自动创建一个原型对象,并且这个原型对象会默认添加一个constructor属性,该属性指向函数本身。在使用构造函数创建对象时,新创建的对象会继承构造函数的原型对象上的所有属性和方法。 通过原型和原型链的机制,我们可以实现对象之间的属性和方法的共享,避免重复创建和占用内存。它使得JavaScript的对象可以实现简单的继承,并且可以方便地进行属性和方法的扩展和修改。 总结起来,原型和原型链是JavaScript中实现面向对象特性的重要概念。通过原型链的查找机制,我们可以实现属性和方法的继承和共享,使得代码更加简洁和高效。 ### 回答3: 在JavaScript中,每个对象都有一个原型(prototype),原型是一个对象,它包含了对象的属性和方法。原型可以被其他对象所共享,这样它们就可以访问到相同的属性和方法。 当我们访问一个对象的属性或方法时,JavaScript引擎会先查找该对象本身是否拥有这个属性或方法,如果没有找到,则会继续查找该对象的原型,即原型链中的下一个对象,以此类推,直到找到该属性或方法,或者查找到达原型链的末尾。 原型链是由原型组成的,即一个对象的原型是另一个对象,而这个对象又有自己的原型,依此类推,形成了一个链条。可以把原型链看作是一种对象之间的继承关系。 当我们创建一个对象时,它会有一个隐藏的属性`__proto__`,指向该对象的原型。我们可以通过`Object.create()`方法来显式地指定对象的原型。如果我们尝试访问对象的一个属性或方法,而该对象本身没有这个属性或方法,JavaScript引擎会自动去原型链上查找,直到找到或者返回`undefined`。 原型和原型链的概念在JavaScript中是非常重要的,它们使得对象可以通过继承的方式共享属性和方法,提高了代码的可复用性和扩展性。同时,原型链也是JavaScript实现对象的继承机制的基础。我们可以通过修改原型链上的对象,来为现有对象增加属性和方法,或者扩展对象的行为。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值