javascript constructor __.proto.__ prototype 概念相关

查看:108
本文介绍了javascript constructor __.proto.__ prototype 概念相关的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

var Person = function(name,age){
this.name = name;
this.age = age;
}
Person.prototype.sayName = function(){
return this.name
}
var p1 = new Person('ceshi',20)

__.proto.__是存在于实例和函数的原型对象关系,
所以存在这一的一个关系

console.log('__proto__',p1.__proto__===Person.prototype,Person.prototype.__proto__===Object.prototype,Function.prototype.__proto__===Object.prototype,Object.prototype.__proto__===null);

prototype 只要创建了一个函数,就会为该函数创建一个prototype属性,指向该函数的原型对象。实例没有prototype属性

console.log(Person.prototype===p1.__proto.__) 

constructor 只要是对象就有constructor属性 包含一个指向prototype属性所在函数的一个指针

console.log(p1.constructor===Person,Person.constructor===Function,Object.constructor===Function,Person.prototype.constructor===Person,Function.prototype.constructor===Function,Object.prototype.constructor===Object)

问题有:

  1. prototype是属性?__.proto.__叫原型对象? 到底是叫什么 原型链中的原型对象是指的prototype还是__.proto.__?

  2. 属性的查找是原型链的查找过程 原型链的顶端是Object.prototype 如果没有找到就返回undefind
    Object.prototype.__proto__===null 不是应该最终找到null么?

  3. Object是由Function构造出来的?
    Object.constructor ===Function // true

Function.prototype.constructor===Function,// true
Function.constructor指向的哪里?
4.原型链是根据什么查找的 是prototype还是__.proto.__ 还是根据constructor指针

最近看了一下这方面的 感觉很多文章中也说法不一 另我很是困惑 希望有知道的人 有时间能够解答
感谢解答指引

解决方案

1. __proto__属性:

所有对象都有此属性。但它不是规范里定义的属性,并不是所有JavaScript运行环境都支持。它指向对象的原型,也就是你说的继承链里的原型。通过Object.getPrototypeOf方法也可以获取对象的原型。

2. prototype属性:

只有函数---准确地说是构造函数---才有此属性,比如Math. pow这样的非构造函数就没有此属性。构造函数是干嘛的?是用来构造(即new)对象的。prototype就是为构造对象这个过程服务的,它指明了构造函数将要创建出来的对象的原型是谁,这样当你new出一个对象时,才知道把这个对象放到原型链的哪个位置。注意:prototype是可以修改的,修改后,用构造函数new出来的对象的原型相应地也会发生变化。另外,instanceof操作也依赖此属性的值。

3. 前面两个的关系

从2.可以看出,当你用构造函数C构造出一个对象obj时,存在下面的等式:

C.prototype === obj.__ptoto__;

4. constructor属性:

并不是所有对象都有此属性。比如上面new出来的对象obj并没有这个属性,或者说这个属性不是对象obj的own property,它实际上是挂在它的原型上面的,即C.prototype.constructor。每个构造函数C刚被制造出来的时候,它的C.prototype上面都会有一个constructor属性,并且执行它本身,即

C. prototype.constructor === C;

当构造函数制造出一个新的对象时,这个属性就被新对象继承了。这个属性并不会被JavaScript引擎内部使用,所以你随便修改它并不会对引擎内部产生影响,注意这一点跟prototype属性不一样。那么这个属性有什么用呢?答案就是:它是给用户代码使用的。比如通过它,就可以知道一个对象的构造函数是谁了。当然前提是它没有被修改。

5. 你的问题

问题:prototype是属性?__.proto.__叫原型对象? 到底是叫什么 原型链中的原型对象是指的prototype还是__.proto.__?

回答:1. prototype是属性。2. 准确地说是__.proto.__指向对象的原型对象。3. 前者总是指向原型对象,后者在没有被修改过的情况下也是指向原型对象的。

问题:属性的查找是原型链的查找过程 原型链的顶端是Object.prototype 如果没有找到就返回undefind
Object.prototype.__proto__===null 不是应该最终找到null么?

回答:不是,找到null时还找不到,就返回undefined。

问题:Object是由Function构造出来的?
Object.constructor ===Function // true

回答:实际上不是,只是逻辑上是,所以为了逻辑上的融洽,JS引擎把Object.constructor强行指向了Function。

问题:原型链是根据什么查找的 是prototype还是__.proto.__ 还是根据constructor指针

回答:谁都不是,或者当然也可以说是根据__.proto.__属性所指向的那个内部对象。你要清楚,prototype、__.proto.__ 和constructor只是三个名字,三个由引擎暴露出来给用户代码用的API。就算你把它们都删除了(加上可以删除的话),它们原来指向的那个对象,在对象内部仍然有内部属性指向它。例如,__.proto.__其实与内部属性[[prototype]]指向相同的对象,引擎在向上查找原型链时正是通过[[prototype]]进行的。所以这个问题的答案是[[prototype]]。

回答完毕,手机回答可能有误,敬请大家指正。

这篇关于javascript constructor __.proto.__ prototype 概念相关的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆